procedure RADIXSORT(var A:TYPPOLE; {Razene pole } N:integer {Pocet prvku pole}); {Procedura seradi zadane pole metodou Radix-sort} const ZAKLAD = 10; MAXCIF = 9; MAXINT = 1111; var P,B : TYPPOLE; {Pole ukazatelu na nasledujici prvek} KONFRONTY : array[-ZAKLAD..MAXCIF] of integer; ZACFRONTY : array[-ZAKLAD..ZAKLAD] of integer; RAD,POM,MAX,POCCIF,CIF,UKMIN,I,J : integer; KONEC : Boolean; begin {Inicializace pomocnych promenych} RAD := 1; POM := N; ZACFRONTY[ZAKLAD] := MAXINT; MAX := abs(A[1]); for I := 2 to N do if MAX0 do begin MAX := MAX div ZAKLAD; POCCIF := succ(POCCIF) end; for J := 1 to POCCIF do begin for I := -ZAKLAD to ZAKLAD do ZACFRONTY[I] := MAXINT; {Inicializace pole ZACFRONTY} KONEC := false; repeat {Trideni do frony dle J-te cislice} if A[POM]>=0 then CIF := (A[POM] mod (ZAKLAD*RAD)) div RAD else CIF := -(abs(A[POM] mod (ZAKLAD*RAD)) div RAD) -1; if ZACFRONTY[CIF]=MAXINT then begin {Fronta je prazdna} ZACFRONTY[CIF] := POM; KONFRONTY[CIF] := POM end else begin {Fronta je neprazdna} P[KONFRONTY[CIF]] := POM; KONFRONTY[CIF] := POM end; if J=1 then if POM=1 then KONEC := true else POM := POM - 1 else begin POM := P[POM]; if POM=MAXINT then KONEC := true end until KONEC; RAD := RAD*ZAKLAD; I := -ZAKLAD; UKMIN := I; while ZACFRONTY[I]=MAXINT do I := I + 1; UKMIN := I; repeat {Spojeni front do jedineho seznamu} POM := KONFRONTY[I]; I := I + 1; while (I<>ZAKLAD) and (ZACFRONTY[I]=MAXINT) do I := I + 1; P[POM] := ZACFRONTY[I] until I=ZAKLAD; POM := ZACFRONTY[UKMIN] end; for I := 1to N do begin B[I] := A[POM]; POM := P[POM] end; for I := 1 to N do A[I] := B[I] end; {procedura RADIXSORT} DIXSORT}