Pseudokod sortowania przez scalanie
Pseudokod sortowania przez scalanie
Specyfikacja:
Dane:
n– liczba naturalna dodatnia, liczba elementów tablicytablica– n‑elementowa tablica liczb całkowitych
Wynik:
posortowana niemalejąco tablica całkowitych liczb
tablica
Algorytm ten można zapisać za pomocą pseudokodu w następujący sposób:
W jaki sposób zastosowane jest podejście „dziel i zwyciężaj” w zapisanym pseudokodzie?
Przeanalizujmy wspólnie instrukcję tego algorytmu. Na początek sprawdzamy, czy podana tablica zawiera więcej niż jeden element. Jeżeli odpowiedź brzmi tak, przechodzimy do kolejnych poleceń.
Linijka jeżeli pocz < kon jest odpowiedzialna za sprawdzenie, czy w tablicy znajduje się więcej niż jeden element. Dla przykładowych wartości pocz = 1, kon = 2 warunek jest spełniony – tablica ma dwa elementy, element 1 oraz element 2. Jeżeli jednak pocz = 2, kon = 2, wtedy tablica ma tylko jeden element.
Od tego kroku zostaje wykorzystana strategia „dziel i zwyciężaj”. Przyjrzyj się i spróbuj zauważyć podobieństwo opisu tej strategii z zapisanym wcześniej za pomocą pseudokodu algorytmem sortowania.
Do zmiennej
połowazapisywany jest indeks podziału tablicy. Pamiętajmy, żeby wynik zaokrąglić w dół do części całkowitej. Dzięki temu tablica będzie podzielona na dwie części. W przypadku parzystej liczby elementów, będą to dwie równe części, w wypadku nieparzystej – pierwsza część będzie zawierała o jeden element więcej od drugiej.Następnie rekurencyjnie wywołujemy funkcję sortowania przez scalanie, osobno dla każdej z dwóch części. Tablica dzielona jest aż do otrzymania tablic jednoelementowych, czyli aż do momentu, w którym algorytm znajdzie przypadek podstawowy.
Ostatnia instrukcja pseudokodu wywołuje funkcję, która łączy posortowane fragmenty tablic w jedną posortowaną tablicę.
Złożoność czasowa i pamięciowa algorytmu
Tablica dzielona jest zawsze na dwie części (co mogliśmy zaobserwować na rysunku przedstawiającym kolejne etapy sortowania przez scalanie tablicy liczb). W wypadku parzystej liczby elementów są to zawsze dwie równe części. W przypadku nieparzystej liczby elementów pierwsza część zawiera tylko o jeden element więcej od drugiej. Zatem dla n‑elementowej tablicy, mamy poziomów zagnieżdżenia funkcji. Złożoność operacji scalania na każdym poziomie drzewa niezależnie od uporządkowania elementów wynosi , gdzie c jest stałą zależną od jakości używanego sprzętu. A więc czas działania algorytmu zarówno dla zbiorów posortowanych, posortowanych odwrotnie jak i nieposortowanych jest proporcjonalny do:
Zatem złożoność czasowa wynosi:
Sortowanie przez scalanie wymaga użycia dodatkowej tablicy, w której będziemy zachowywać wynik scalania, więc dla n‑elementowej tablicy złożoność pamięciowa wynosi O(n). W związku z tym, merge sort nie jest tzw. sortowaniem w miejscu.