Potrzebujemy algorytmu do sortowania liczb całkowitych z przedziału od do w czasie .
Użyjemy tutaj algorytmu RadixSort
do podzielenia liczb na części które sortujemy dalej przy pomocy algorytmu CountingSort
.
Przy czym, wybór sposobu podziału jest istotny podczas naszego „dzielenia liczb na części”. Zależy nam na złożoności , więc najlepiej przejść z bazy dziesiętnej na bazę .
Wówczas CountingSort
zostanie użyty tylko dwa razy, jako że mamy tylko liczb do posortowania o postaci , gdzie to cyfry liczby w bazie .
Oczywiście tutaj pojawia się problem liczby która wykracza poza ten zakres, ponieważ ma postać .
Rozwiązaniem może być wprowadzenie specjalnego przypadku dla tej liczby, jako że jest to imum rozważanego przedziału. Możemy wtedy instancje takich liczb przesuwać na sam koniec posortowanej listy.
Innym rozwiązaniem tutaj może być przesunięcie wszystkich elementów o lokalnie, na czas sortowania. Wówczas mielibyśmy liczby z zakresu które jak najbardziej da się zapisać w formacie .
W rozwiązaniu rozważymy algorytm przesuwający liczby o żeby zmieściły się w zakresie .
CustomSort
:
input :
- lista liczb z przedziału
output:
posortowana lista
while
while
++
++
while
++
while
--
--
while
++
CountSort
, która sortuje poszczególne liczby po ich cyfrach w bazie .