RadixSort

triedenie po cifrách:
pripravíme K pomocných kôpok, do ktorých budeme prehadzovať hodnoty zo vstupnej postupnosti
K - počet rôznych hodnôt, ktoré môžu nadobúdať jednotlivé cifry (napr. pre čísla 10, pre znaky 26 a pod.)
v prvom prechode postupne prehadzujeme všetky hodnoty do príslušnej kôpky podľa poslednej cifry
potom všetky kôpky spojíme - zoradíme opäť do jednej postupnosti
v druhom prechode prehadzujeme hodnoty do kôpok podľa predposlednej cifry
opäť ich potom spojíme do jednej postupnosti
toto postupne opakujeme pre všetky cifry - na záver je celá postupnosť utriedená vzostupne
takto sa dobre triedia spájané zoznamy
pri práci s poliami si tento algoritmus vyžaduje veľa pomocných polí

 

Takto vypadá Radixsort v Pascalu

const
N = 14; (* NO. OF DATA TO BE SORTED *)
Digits = 3; (* DIGITAL SIZE OF THE DATA *)
Range = 1000; (* RANGE FOR THE RANDOM GENERATOR *)

type
ArrayType = array[1..N] of integer;
TwoDimension = array[0..9, 1..N] of integer;

var
Data : ArrayType;
D : integer;

 

 

function Hash(Number, H : integer) : integer;
begin
case H of
3 : Hash := Number mod 10;
2 : Hash := (Number mod 100) div 10;
1 : Hash := Number div 100
end
end;

procedure CleanArray(var TwoD : TwoDimension);
var
I, J : integer;
begin
for I := 0 to 9 do
for J := 1 to N do
TwoD[I, J] := 0
end;

procedure PlaceIt(var X : TwoDimension; Number, I : integer);
var
J : integer;
Empty : boolean;
begin
J := 1;
Empty := false;
repeat
if (X[I, J] > 0) then
J := J + 1
else
Empty := true;
until (Empty) or (J = N);
X[I, J] := Number
end;

procedure UnLoadIt(X : TwoDimension; var Passed : ArrayType);
var
I,
J,
K : integer;
begin
K := 1;
for I := 0 to 9 do
for J := 1 to N do
begin
if (X[I, J] > 0) then
begin
Passed[K] := X[I, J];
K := K + 1
end
end
end;

procedure RadixSort(var Pass : ArrayType; N : integer);
var
Temp : TwoDimension;
Element,
Key,
Digit,
I : integer;
begin
for Digit := Digits downto 1 do
begin
CleanArray(Temp);
for I := 1 to N do
begin
Element := Pass[I];
Key := Hash(Element, Digit);
PlaceIt(Temp, Element, Key)
end;
UnLoadIt(Temp, Pass);
ShowOutput;
readln
end
end;