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.
|