Szczególnie jest przydatny zwłaszcza przy danych dostępnych sekwencyjnie (po kolei, jeden element naraz), na przykład w postaci listy jednokierunkowej (tj. łączonej jednostronnie) albo pliku sekwencyjnego[potrzebny przypis].
Złożoność czasowa
Obrazek obok przedstawia drzewo rekursji wywołania algorytmu mergesort.
Mamy więc drzewo o głębokości na każdym poziomie dokonujemy scalenia o łącznym koszcie gdzie jest stałą zależną od komputera. A więc intuicyjnie, tzn. nieformalnie możemy dowieść, że złożoność algorytmu mergesort to
Formalnie złożoność czasową sortowania przez scalanie możemy przedstawić następująco:
Bez straty ogólności załóżmy, że długość ciągu, który mamy posortować jest potęgą liczby 2[1]:
Ciągi jednoelementowe możemy posortować w czasie stałym, czas sortowania ciągu -elementowego to scalenie dwóch ciągów -elementowych, czyli O(n), plus czas potrzebny na posortowanie dwóch o połowę krótszych ciągów.
Mamy:
gdzie
Po rozwinięciu nawiasów otrzymamy:
A więc asymptotyczny czas sortowania przez scalanie wynosi O(n log n)[1] (zobacz: notacja dużego O).
Wersja nierekurencyjna
Podstawową wersję algorytmu sortowania przez scalanie można uprościć. Pomysł polega na odwróceniu procesu scalania serii. Ciąg danych możemy wstępnie podzielić na serii długości scalić je tak, by otrzymać serii długości scalić je otrzymując serii długości
Złożoność obliczeniowa jest taka sama jak w przypadku klasycznym, tu jednak nie korzystamy z rekursji, a więc zaoszczędzamy czas i pamięć potrzebną na jej obsłużenie.
Przypisy
↑ abcdeThomas H. Cormen, Charles E. Leiserson, Ronald R. Rivest: Wprowadzenie do algorytmów. Warszawa: Wydawnictwa Naukowo-Techniczne, 1997, 1998, s. 32–35. ISBN 83-204-2317-1.
↑DonaldD.KnuthDonaldD., The Art of Computer Programming 3, Sorting and Searching (2nd ed.), Addison-Wesley, s. 158–168, ISBN 0-201-89685-0.