R19MKSVQPXEM7
Zdjęcie przedstawia stertę kolorowych klocków lego.

I_R_W14_M26_C++ Sortowanie przez scalanie

Źródło: Xavi Cabrera, domena publiczna.

Scalanie posortowanych tablic

Sortowanie przez scalanie polega na podzieleniu sortowanej struktury danych na dwie części, następnie na rekurencyjnym sortowaniu każdej z tych części i ponownym scaleniu już posortowanych części w jedną całość. Warto wiedzieć, że jako pierwszy tę metodę opisał John von Neumann, znany jako twórca m.in. teorii gier oraz koncepcji automatów komórkowych. Algorytm sortowania przez scalanie oparty jest na metodzie dziel i zwyciężaj.

Wyobraźmy sobie, że mamy dwie półki, każda z losową liczbą książek. Książki na półkach ułożone są w kolejności alfabetycznej. Naszym celem jest ułożenie wszystkich książek na trzeciej półce, w kolejności alfabetycznej. By to zrobić, porównujemy ze sobą pierwszą książkę z półki nr 1 z pierwszą książką na półce nr 2. Książka z literą położoną wcześniej w alfabecie, zostaje przeniesiona na trzecią półkę. Czynność powtarzamy, porównując książki, które ułożone są jako pierwsze na półkach. W momencie, gdy skończą nam się książki na jednej z półek, resztę książek z drugiej półki po prostu przenosimy na koniec naszej trzeciej, dodatkowej półki. Aby lepiej zrozumieć algorytm scalania książek na półkach, przeanalizuj rysunek.

R1CBKFZXF9EVP
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Etapy sortowania przez scalanie

Chcemy uporządkować niemalejąco n-elementową tablicę liczb całkowitych. W jaki sposób to zrobić, korzystając z metody sortowania przez scalanie?

Aby użyć omówionego wcześniej algorytmu scalania, musimy podzielić tablicę na mniejsze, same w sobie posortowane tablice. W tym celu tablicę dzielimy na pół – jeżeli liczba elementów jest nieparzysta, pierwsza tablica będzie miała jeden element więcej.

Proces powtarzamy do momentu, w którym osiągniemy tablice jednoelementowe.  Wiemy, że tablica posiadająca jeden element już jest posortowana. Dzięki temu możemy scalić dwie tablice jednoelementowe i uzyskać kolejną, posortowaną dwuelementową tablice. Następnie możemy scalić dwie posortowane tablice dwuelementowe, aby uzyskać czteroelementową itd. Przejdźmy do rysunku przedstawiającego kolejne etapy sortowania przez scalanie na podstawie przykładowej tablicy.

R19TR1Q5H8B3S
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
1
Ćwiczenie 1

Uruchom aplet przedstawiający kolejne kroki algorytmu merge sort dla przykładowej tablicy. Przetestuj algorytm sortowania dla n‑elementowej tablicy. Tablicę możesz wypełnić liczbami z przedziału [-99, 99], wartość n nie może być większa od 15.

Specyfikacja:

Dane:

  • n – liczba naturalna dodatnia; liczba elementów w tablicy tablica

  • tablican-elementowa tablica liczb całkowitych

Wynik:

  • posortowana niemalejąco tablica liczb całkowitych tablica

R1FBP12LT7KX7
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Poszukaj dodatkowych informacji na temat algorytmu merge sort.

Słownik

dziel i zwyciężaj
dziel i zwyciężaj

metoda, która polega na podzieleniu problemu na mniejsze, podobne problemy, znalezieniu ich rozwiązań, a następnie ponownym połączeniu ich w jedną całość, by otrzymać rozwiązanie całego problemu

John von Neumann
John von Neumann

węgierski matematyk, chemik, fizyk i informatyk; jest uznawany za głównego twórcę teorii gier i formalizmu matematycznego mechaniki kwantowej

przypadek podstawowy
przypadek podstawowy

przypadek, dla którego funkcja rekurencyjna nie wywołuje samej siebie, a zamiast tego zwraca z góry określoną wartość

rekurencja
rekurencja

sytuacja, w której funkcja wywołuje samą siebie, aż do napotkania przypadku podstawowego

sortowanie w miejscu
sortowanie w miejscu

tzw. in situ; algorytm, który do posortowania zbioru danych potrzebuje stałej ilości pamięci komputera, niezależnej od rozmiaru danych wejściowych; wszelkie potrzebne do otrzymania wyniku obliczenia są wykonywane w pamięci, w której znajdują się dane

złożoność czasowa
złożoność czasowa

cecha algorytmu, która wyraża czas niezbędny do wykonania danego algorytmu dla konkretnych danych, podana jako funkcja rozmiaru tych danych wejściowych; zazwyczaj rozpatruje się liczbę operacji podstawowych (dominujących), w przypadku sortowania najczęściej jest to operacja porównania wartości dwóch elementów, można też przyjąć operację przestawiania elementów

koncepcja automatów komórkowych
koncepcja automatów komórkowych

polega na zastąpieniu zbioru skomplikowanych równań opisujących zachowanie się wielu układów fizycznych, systemem komórek sąsiadujących ze sobą według pewnego ustalonego wzorca