Sortowanie pozycyjne (ang. radix sort) jest stabilnym algorytmem sortowania. Dzięki niemu możemy posortować wyrażenia złożonych z dowolnych znaków. Sortowanie zaczynamy od znaków na pozycjach najmniej znaczących czyli od ostatnich znaków wyrażenia. Kolejny krok polega, aby posortować wyrażenia według przedostatniego znaku i tak kontynuujemy, aż dotrzemy do pierwszego znaku. Metoda ta znajduje zastosowanie podczas porządkowania bardzo dużych liczb. Załóżmy, że mamy n liczb po ponad kilka tysięcy cyfr. Liczby mogą się różnić tylko na ostatnich pozycjach. Próba sortowania tradycyjnymi metodami mogłaby się okazać nieefektywne ze względu na ilość wykonywanych porównań.
Algorytm sortujący według znaku jest dowolny. Możemy użyć tutaj algorytmu bąbelkowe o złożoności jak również sortowania szybkiego o złożoności algorytmu . W przypadku sortowania pozycyjnego złożoność wyniesie m*a, gdzie m określa ilu znakowe są porównywane elementy, a a to złożoność czasowa wybranego algorytmu sortowania.
Spróbujmy prześledzić teraz sortowanie na przykładzie listy L:={ACB, BAC, ABB}. Użyjemy do tego sortowania bąbelkowego. Pierwsze pętla będzie sortowała według ostatniego znaku każdego elementu.
(Pogrubione zostały znaki według których sortujemy, a kursywą zostały zapisane słowa porównywane)
Lista | Komentarz | Nowa lista |
---|---|---|
{ACB, BAC, ABB} | B < C, nie zamieniamy | {ACB, BAC, ABB} |
{ACB, BAC, ABB} | C > B, zamieniamy | {ACB, ABB, BAC} |
{ACB, ABB, BAC} | B = B, nie zamieniamy | {ACB, ABB, BAC} |
Kolejną pętla sortuje według znaku na pozycji bardziej znaczącej - tutaj jest to drugi znak:
Lista | Komentarz | Nowa lista |
---|---|---|
{ACB, ABB, BAC} | C > B, zamieniamy | {ABB, ACB, BAC} |
{ABB, ACB, BAC} | C > A, zamieniamy | {ABB, BAC, ACB} |
{ABB, BAC, ACB} | B > A, zamieniamy | {ABB, ACB, BAC} |
I ostatnia w tym przypadku iteracja, ponieważ długość wyrazów wynosi 3 to porządkowanie według pierwszego znaku:
Lista | Komentarz | Nowa lista |
---|---|---|
{ABB, ACB, BAC} | A = A, nie zamieniamy | {ABB, ACB, BAC} |
{ABB, ACB, BAC} | A < B, nie zamieniamy | {ABB, ACB, BAC} |
{ABB, ACB, BAC} | A = A, nie zamieniamy | {ABB, ACB, BAC} |
W ten sposób uzyskaliśmy posortowaną rosnąco tablicę L:={ABB, ACB, BAC}.
Algorytm ten możemy stosować do sortowania wyrazów, bardzo długich liczb oraz list zawierający nietypowe obiekty tj. każdy element listy ma kilka pól. Algorytm sortowania pozycyjnego będzie można dostosować, aby można było sortować według wybranych pól. Najprostszym przykładem byłaby tu lista punktów. Sortowalibyśmy tutaj najpierw według współrzędnej Y, a potem po wartość współrzędnej X.
Załóżmy, że nasz program wczyta najpierw listę wyrazów długości d o n elementach. Na wyjście mamy zwrócić posortowaną listę elementów.
Ogólny przykład sortowania pozycyjnego wyglądałby tak:
Funkcję sortującą należy wstawić w linijce (3.). Algorytm sortujący powinien porównywać elementy według i-tego znaku wyrazów.
Uzupełniony algorytm sortowania pozycyjnego o sortowanie bąbelkowe wyglądałby tak:
(1. - 2.) Do sortowania bąbelkowego będziemy potrzebować zmiennej tymczasowej, aby można było zamienić wartości miejscami. (4.) Dla kolejnych znaków - od najmniej do najbardziej znaczącego wykonujemy sortowanie bąbelkowe (5. - 13.) według i-tego co zostało zastosowane w linijce (7.) podczas porównywania elementów. (15.) Dealokujemy pamięć zarezerwowaną pod zmienną temp.
Funkcję sortującą możemy przetestować następującym kodem:
Zmodyfikuj funkcję sort(), aby dane były sortowane metodą Sortowania przez Wybór. Dane mają być posortowane malejąco.
Przykładowo dla danych:
otrzymamy: