Sortowanie pozycyjne

Sortowanie pozycyjne (ang. radix sort) to algorytm sortowania porządkujący stabilnie ciągi wartości (liczb, słów) względem konkretnych cyfr, znaków itp, kolejno od najmniej znaczących do najbardziej znaczących pozycji[1]. Złożoność obliczeniowa jest równa O ( d ( n + k ) ) , {\displaystyle O(d(n+k)),} gdzie k {\displaystyle k} to liczba różnych cyfr, a d {\displaystyle d} liczba cyfr w kluczach[1]. Wymaga O ( n + k ) {\displaystyle O(n+k)} dodatkowej pamięci.

Przewagą sortowania pozycyjnego nad innymi metodami jest fakt, iż nie wykonuje ono żadnych operacji porównania na danych wejściowych[1]. Załóżmy, że mamy dużą liczbę bardzo długich liczb, bardzo do siebie podobnych – w tym sensie, że większość z nich ma takie same cyfry na początkowych pozycjach. Nie jest łatwo powiedzieć która jest większa, gdyż za każdym razem musimy porównać dużo cyfr, zanim trafimy na różnicę. Czas porównania takich liczb jest zatem proporcjonalny do ich długości[1]. Gdybyśmy do posortowania tych liczb zastosowali algorytm porównujący liczby, np. sortowanie szybkie, otrzymalibyśmy dla niego złożoność O ( d n log n ) {\displaystyle O(dn\log n)} gdzie d {\displaystyle d} to liczba cyfr w liczbach[2].

Dla krótkich ciągów efektywniejsze jest sortowanie przez zliczanie[1].

Algorytmy pozycyjne sprawdzają się także w roli algorytmów sortujących listy.

Implementacja w pseudojęzyku programowania[1]

  • tab[] – tablica ciągów (cyfr, liter itp.) gdzie pozycja 1 oznacza najbardziej znaczącą pozycje ciągu
  • d – długość ciągów
procedure RadixSort(tab[],d)
begin
   for i:=d downto 1 do
       posortuj stabilnie ciągi według i-tej pozycji;
end;

Dowód poprawności algorytmu sortowania pozycyjnego

Wikipedia:Weryfikowalność
Ta sekcja od 2011-04 wymaga zweryfikowania podanych informacji.
Należy podać wiarygodne źródła w formie przypisów bibliograficznych.
Część lub nawet wszystkie informacje w sekcji mogą być nieprawdziwe. Jako pozbawione źródeł mogą zostać zakwestionowane i usunięte.
Sprawdź w źródłach: Encyklopedia PWN • Google Books • Google Scholar • Federacja Bibliotek Cyfrowych • BazHum • BazTech • RCIN • Internet Archive (texts / inlibrary)
Dokładniejsze informacje o tym, co należy poprawić, być może znajdują się w dyskusji tej sekcji.
Po wyeliminowaniu niedoskonałości należy usunąć szablon {{Dopracować}} z tej sekcji.

Załóżmy, że przed i-tym przebiegiem pętli for, wszystkie ciągi są posortowane według (i-1)tej cyfry/litery. Po kolejnej iteracji ciągi będą posortowane według i-tej. Jeżeli dla dwóch, lub więcej ciągów, ich i-ta cyfra/litera jest taka sama, stabilność sortowania zapewni nam zachowanie pierwotnego porządku. Po ostatnim przebiegu pętli for ciągi będą uporządkowane według najbardziej znaczących cyfr, oraz kolejnych w przypadku identyczności na ostatnich pozycjach.

Powyższy algorytm zakłada, że ciągi są tej samej długości. W przypadku gdy tak nie jest, możemy uzupełnić ciągi do tej samej długości zerami z lewej strony (dla liczb) lub zerowymi znakami z prawej (dla napisów). Jeżeli ciągów długich jest niewiele, metoda ta jest nieefektywna, jednak istnieją modyfikacje oryginalnego algorytmu działające ściśle w czasie liniowym względem rozmiaru danych.

Przykład działania algorytmu sortowania pozycyjnego

^ wskazuje pozycję posortowaną w danym przejściu.

523     472     523     266
266     523     349     349
783 --> 783 --> 266 --> 472
472     266     472     523
349     349     783     783
          ^      ^      ^ 

Przypisy

  1. a b c d e f Thomas H.T.H. Cormen Thomas H.T.H., Charles E.Ch.E. Leiserson Charles E.Ch.E., Ronald L.R.L. Rivest Ronald L.R.L., Wprowadzenie do algorytmów, wyd. 5, Warszawa: Wydawnictwa Naukowo-Techniczne, 2003, s. 212-214, ISBN 978-83-204-2800-9, OCLC 749640953 [dostęp 2021-06-05]  (pol.).
  2. Thomas H.T.H. Cormen Thomas H.T.H., Charles E.Ch.E. Leiserson Charles E.Ch.E., Ronald L.R.L. Rivest Ronald L.R.L., Wprowadzenie do algorytmów, wyd. 5, Warszawa: Wydawnictwa Naukowo-Techniczne, 2003, s. 186, ISBN 978-83-204-2800-1, OCLC 749640953 [dostęp 2021-06-05] .
  • p
  • d
  • e
Algorytmy sortowania
Algorytmy stabilne
Algorytmy niestabilne