program SortInteger;
{$Mode objfpc}{$H+}
{$IfDef windows}{$AppType console}{$EndIf}
type
TByteDynArray = array of Byte;
TDWordDynArray = array of DWord;
function FoundMinMax(aDWordArray: TDWordDynArray; out aMin, aMax: DWord): Boolean;
var
i: DWord;
begin
aMin:=High(DWord);
aMax:=Low(DWord);
for i in aDWordArray do begin
if i > aMax then
aMax:=i
else if i = aMax then // this detects some duplicates
Exit(False);
if i < aMin then
aMin:=i
else if i = aMin then
Exit(False);
end;
Result:=True;
end;
procedure DivMod(aDividend, aDivisor: DWord; out aDiv, aMod: DWord);
begin
aDiv:=aDividend div aDivisor;
aMod:=aDividend - (aDiv * aDivisor);
end;
procedure SetBit(aBitIndex: Byte; var aByte: Byte);
begin
aByte:=aByte or (%1 shl aBitIndex);
end;
procedure MapToByteArray(aNum: DWord; var aByteArray: TByteDynArray);
var
divved, remainder: DWord;
begin
DivMod(aNum, 8, divved, remainder);
SetBit(remainder, aByteArray[divved]);
end;
function ArrayOfBitsToNumber(anIndex: Integer; aBit: Byte; aByteArray: TByteDynArray): DWord;
begin
Exit(anIndex shl 3 + aBit);
end;
function IsArrayBitSet(anIndex: Integer; aBit: Byte; aByteDynArray: TByteDynArray): Boolean;
var
mask: Byte;
begin
mask:=(%1 shl aBit);
Exit(aByteDynArray[anIndex] and mask = mask);
end;
var
sortArray: TByteDynArray;
dwa: TDWordDynArray;
min, max, dw: DWord;
index, bit: Integer;
begin
// example array of non-duplicate integral values
dwa:=TDWordDynArray.create(3547, 100, 223, 16, 89, 33, 500, 100, 89);
if not FoundMinMax(dwa, min, max) then
WriteLn('Integer sequence contains duplicate(s)')
else begin
WriteLn('min=',min,', max=',max);
SetLength(sortArray, max div 8 + 1);
for dw in dwa do
MapToByteArray(dw, sortArray);
min:=min div 8;
for index:=min to High(sortArray) do
for bit:=0 to 7 do
if IsArrayBitSet(index, bit, sortArray) then begin
Writeln(ArrayOfBitsToNumber(index, bit, sortArray));
end;
end;
ReadLn;
end.