Some topics from this lecture are also covered in the Introduction to Algorithms textbook:
3.1 Asymptotic notation
8.1 Lower bounds for sorting
8.2 Counting sort
8.3 Radix sort
{$mode delphi}
{$r+}
const
size = 1000;
type
int_array = array of integer;
// Sort an array of values in the range 0 .. (size - 1).
function countingSort(const a: array of integer): int_array;
var
count: array[0 .. size - 1] of integer;
b: array of integer;
i, n: integer;
begin
for i := 0 to size - 1 do
count[i] := 0;
for i in a do
count[i] := count[i] + 1;
n := length(a);
for i := size - 1 downto 0 do
begin
n := n - count[i];
count[i] := n;
end;
setLength(b, length(a));
for i in a do
begin
b[count[i]] := i;
count[i] := count[i] + 1;
end;
exit(b);
end;
var
a: array of integer;
i: integer;
begin
setLength(a, 50);
for i := low(a) to high(a) do
a[i] := random(size);
a := countingSort(a);
for i in a do
write(i, ' ');
writeln;
end.{$mode delphi}
{$r+}
{$optimization on}
unit radix_sort;
interface
procedure radixSort(var a: array of integer);
implementation
const
base = 65536;
bits = 16;
procedure sortDigit(const a: array of integer; var b: array of integer; d: integer);
var
count: array[0 .. base - 1] of integer;
i, x, n: integer;
begin
for i := 0 to base - 1 do
count[i] := 0;
for i in a do
begin
x := (i shr d) mod base;
count[x] := count[x] + 1;
end;
n := length(a);
for i := base - 1 downto 0 do
begin
n := n - count[i];
count[i] := n;
end;
for i in a do
begin
x := (i shr d) mod base;
b[count[x]] := i;
count[x] := count[x] + 1;
end;
end;
procedure radixSort(var a: array of integer);
var
b: array of integer;
begin
setLength(b, length(a));
sortDigit(a, b, 0);
sortDigit(b, a, bits);
end;
end.