adventofcode/2020/5/URadixSort.pas
2022-12-01 21:02:00 +01:00

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.