80 lines
1.4 KiB
ObjectPascal
80 lines
1.4 KiB
ObjectPascal
|
(* This is copy pasted from the wiki *)
|
||
|
(* No way that I'm writing my own sorting *)
|
||
|
(* algorithm for this challenge lol *)
|
||
|
|
||
|
unit URadixSort;
|
||
|
|
||
|
{$mode objfpc}{$H+}
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
Classes, SysUtils,
|
||
|
GQueue ; // packages/fcl-stl/src/gqueue.pp
|
||
|
|
||
|
type
|
||
|
// data type
|
||
|
TItemRadixSort=integer;
|
||
|
|
||
|
// sorting function
|
||
|
procedure RadixSort( var a: array of TItemRadixSort );
|
||
|
|
||
|
implementation
|
||
|
|
||
|
|
||
|
|
||
|
procedure RadixSort( var a: array of TItemRadixSort );
|
||
|
|
||
|
const
|
||
|
BASE = 16;
|
||
|
|
||
|
type TQueueIRS = specialize TQueue< TItemRadixSort >;
|
||
|
|
||
|
var
|
||
|
jono : array[ 0 .. BASE - 1 ] of TQueueIRS;
|
||
|
max : TItemRadixSort;
|
||
|
i ,k : integer;
|
||
|
|
||
|
procedure pick;
|
||
|
var
|
||
|
i, j: integer;
|
||
|
begin
|
||
|
i := 0;
|
||
|
j := 0;
|
||
|
while i < high( a ) do
|
||
|
begin
|
||
|
while not jono[ j ].IsEmpty do
|
||
|
begin
|
||
|
a[ i ] := jono[ j ].Front;
|
||
|
jono[ j ].Pop;
|
||
|
inc( i );
|
||
|
end;
|
||
|
inc( j );
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
begin
|
||
|
max := high( a );
|
||
|
for i := 0 to BASE - 1 do
|
||
|
jono[ i ] := TQueueIRS.Create;
|
||
|
for i := low( a ) to high( a ) do
|
||
|
begin
|
||
|
if a[ i ] > max then max := a[ i ];
|
||
|
jono[ abs( a[ i ] mod BASE ) ].Push( a[ i ] );
|
||
|
end;
|
||
|
pick;
|
||
|
k := BASE;
|
||
|
while max > k do
|
||
|
begin
|
||
|
for i := low( a ) to high( a ) do
|
||
|
jono[ abs( a[ i ] div k mod BASE ) ].Push( a[ i ] );
|
||
|
pick;
|
||
|
k := k * BASE;
|
||
|
end;
|
||
|
for i := 0 to BASE - 1 do
|
||
|
jono[ i ].Free;
|
||
|
|
||
|
end;
|
||
|
|
||
|
end.
|