type
TIntAry = array [0..32767] of Integer;
PIntAry = ^ TIntAry;
procedure Swap(var a, b: Integer);
var
c: Integer;
begin
c := a;
a := b;
b := c;
end;
procedure Reverse(Data:PIntAry; Len: Integer);
var
I, J: Integer;
begin
I := 0;
J := Len - 1;
while I < J do
begin
Swap(Data[I], Data[J]);
Inc(I);
Dec(J);
end;
end;
function NextPermutation(Data:PIntAry; Len: Integer): Boolean;
var
I: Integer;
J: Integer;
K: Integer;
Completed: Boolean;
begin
if (Len < 2) then
Result := False
else
begin
I := Len - 1;
Completed := False;
while not Completed do
begin
J := I;
Dec(I);
if Data[I] < Data[J] then
begin
K := Len;
repeat
Dec(K);
until Data[I] < Data[K];
Swap(Data[I], Data[K]);
Reverse(@Data[J], Len - J);
Result := True;
Completed := True;
end
else if I = 0 then
begin
Reverse(Data, Len);
Result := False;
Completed := True;
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
type
TData = array[0..3] of Integer;
const
Data: TData =
(1,2,3,4);
function AryToStr(var D: TData): String;
begin
Result := Format('%d,%d,%d,%d', [d[0],d[1],d[2],d[3]]);
end;
var
a: TData;
begin
A := Data;
repeat
Memo1.Lines.Add(AryToStr(a));
until not NextPermutation(@a, Length(a));
end;