Radix sort (přihrádkové řazení) je stabilní řadící algoritmus používaný především k řazení řetězců totožné délky.
Princip
Princip radix sortu vychází přímo z definice stabilního řazení – řadicí algoritmus je stabilní, pokud zachovává pořadí klíčů, které mají stejnou hodnotu (tj. pokud stuktury seřadíme napřed dle klíče A, poté podle klíče B, tak jsou seřazeny podle B, a kde jsou si hodnoty B rovny, tam jsou struktury v pořadí daném klíčem A).
Radix sort řadí řetězce totožné délky tak, že nad každým znakem od konce těchto řetězců zavolá stabilní řadicí algoritmus (seřadí řetězce podle posledního znaku, poté podle předposledního...). Po n-tém průchodu jsou řetězce seřazeny dle všech pozic znaků.
Asymptotická složitost
Asymptotická složitost radix sortu je , kde
je počet znaků řazených řetězců,
je velikost dat a
je složitost vnitřního stabilního řadícího algoritmu (za tímto účelem je často použit
counting sort).
Kód
1.
function radixSort(String s)
2.
for
i in (s.length -
1
) ->
0
do
3.
stableSort(s[i])
01.
/**
02.
* Radix sort - prihradkove razeni
03.
* Od nejnizsi hodnoty - vnitrni stabilni razeni: counting sort
04.
* @param array pole k serazeni
05.
* @param dimension rozmer dat (fixni)
06.
* @return serazene pole
07.
*/
08.
public
static
String[] radixSort(String[] array,
int
dimension){
09.
for
(
int
i = dimension -
1
; i >=
0
; i--){
10.
array = countingSortForRadix(array, i);
//stabilne serad dle i-te pozice
11.
}
12.
return
array;
13.
}
14.
/**
15.
* Counting sort pro radix sort - radi pole dle hodnoty na pozici
16.
* @param array pole k serazeni
17.
* @param position pozice, podle ktere se bude radit
18.
* @return serazene pole dne pozice
19.
*/
20.
public
static
String[] countingSortForRadix(String[] array,
int
position){
21.
String[] aux =
new
String[array.length];
22.
23.
char
min = array[
0
].charAt(position);
24.
char
max = array[
0
].charAt(position);
25.
for
(
int
i =
1
; i < array.length; i++){
26.
if
(array[i].charAt(position) < min) min = array[i].charAt(position);
27.
else
if
(array[i].charAt(position) > max) max = array[i].charAt(position);
28.
}
29.
30.
int
[] counts =
new
int
[max - min +
1
];
31.
32.
for
(
int
i =
0
; i < array.length; i++){
33.
counts[array[i].charAt(position) - min]++;
34.
}
35.
36.
counts[
0
]--;
37.
for
(
int
i =
1
; i < counts.length; i++){
38.
counts[i] = counts[i] + counts[i-
1
];
39.
}
40.
41.
for
(
int
i = array.length -
1
; i >=
0
; i--){
42.
aux[counts[array[i].charAt(position) - min]--] = array[i];
43.
}
44.
45.
return
aux;
46.
}