Solange dein Array weniger als 65 Zahlen beinhaltet, kannst du dich eines Tricks bedienen:
Delphi-Quellcode:
type
TIntArray = array of Integer;
var
Mask: Int64 = 0;
Numbers: TIntArray;
function NextPermutation: TIntArray,
var i: Integer;
begin
SetLength(Result, 0);
Inc(Mask);
for i := 0 to High(Numbers) do
if (Mask shr i) and 1 <> 0 then
begin
SetLength(Result, Length(Result)+1);
Result[High(Result)] := Numbers[i];
end;
end;
Dabei ist Mask der eigentlich trickreiche Teil, hier wird kodiert, welche Zahlen im Ergebnis enthalten sind. Da Mask nur 64 Bits hat, für jede Zahl in Numbers eins, kann Numbers nur 64 Elemente lang sein. Bei jedem Schritt wird Mask um 1 erhöht und dann die nächste Permutation erzeugt.
Wenn du das mit beliebig großen Arrays machen willst, brauchst du eine Möglichkeit, mit beliebig langen Zahlen zu hantieren. Dabei werden nur zwei Anforderungen gestellt: eine Zahl muss inkrementierbar sein und man muss beliebige Bits der Zahl inspizieren können. Die Implementierung einer solchen Klasse ist eine Übungsaufgabe