Sortowanie przez scalanie
Jeśli na liście znajduje się więcej niż jeden węzeł
Rozdzielasz listę mniej więcej na połowy
Sortujesz rekurencyjnie obydwie połowy
Scalasz dwie posortowane połowy w jedną posortowaną listę
Rozdzielanie listy
Szukasz środkowego węzła
(przechodząc listę dwoma wskaźnikami jeden iterujesz dwa razy drugi tylko raz w pojedynczym przejściu pętli)
Inicjujesz głowy dla rozdzielanych list i przerywasz je
Scalanie dwóch posortowanych list
Sprawdzasz czy któraś z list jest pusta i jeśli jest to głowie listy wynikowej przypisujesz głowę drugiej listy
Ustawiasz głowę dla listy wynikowej porównując wartości pól kluczowych w głowach list które scalasz
Porównujesz wartości pól kluczowych w kolejnych węzłach dopóki nie przejdziesz co najmniej jednej z list
Po przejściu jednej z list dołączasz resztę węzłów z pozostałej listy
Dla listy dwukierunkowej musisz poprawnie ustawić wskaźniki na poprzedniki inaczej
lista będzie poprawnie iterowana tylko w jedną stronę
Sortowanie drzewem binarnym
- Z węzłów listy dwukierunkowej budujemy drzewo binarne w ten sposób że
pierwszy element listy dwukierunkowej wstawiamy do korzenia drzewa binarnego
Kolejne elementy wstawiamy następująco
Jeśli wartość wartość klucza korzenia poddrzewa jest równa
wartości klucza wstawianego węzła to mamy wybór
możemy wstawić węzeł albo do lewego poddrzewa albo do prawego poddrzewa
jednak proponowałbym abyśmy w swym wyborze byli konsekwentni
Jeśli wartość wartość klucza korzenia poddrzewa jest mniejsza od
wartości klucza wstawianego węzła to wstawiamy węzeł do prawego poddrzewa
Jeśli wartość wartość klucza korzenia poddrzewa jest większa od
wartości klucza wstawianego węzła to wstawiamy węzeł do lewego poddrzewa
- Przekształcamy drzewo binarne w listę dwukierunkową przechodząc je „ in order”
czyli w kolejności L -> P -> R (Lewy potomek -> Rodzic -> Prawy potomek)
Sortowanie przez podział
-
Wybór elementu rozdzielającego , tzw pivota
Dla listy najszybszy dostęp mamy do głowy i ogona
inne węzły musielibyśmy wyszukać
-
Rozdzielenie listy na trzy podlisty
-
na podlistę o kluczach mniejszych niż klucz pivota
-
na podlistę o kluczach równych kluczowi pivota
-
na podlistę o kluczach większych niż klucz pivota
-
Rekurencyjne sortowanie podlist o kluczach różnych od klucza pivota
-
Połączenie podlist w listę wynikową
To łączenie bywa nazywane konkatenacją
Bez rekursji to może łączenie naturalne ?
.kassad mógłby ten algorytm dokładnie opisać
Co prawda łączenie naturalne jest stosowane do sortowania plików
ale można ten algorytm przystosować do sortowania listy