Stichwort: Graycodes
Hier eine Kopie eines Beitrages von mir aus dem Delphi-Forum;
Man kann Permutationen aufzählen. Dazu schreibt man alle Permutationen auf. Anschließend schreibt man neben jede Permutation den Inverse-Code: Für jedes Zeichen wird die Anzahl der Zeichen gezählt, die rechts vom Zeichen vorkommen und größer sind.
Jede Stelle i dieses Codes wird nun mit (i-1)! multipliziert (von rechts zählen). Wir erhalten die Zahlen von 0 bis n!-1 (n=Anzahl der Stellen). Damit haben wir eine Ordnung auf den Permutationen
- 321 000 0
312 010 1
231 100 2
213 110 3
132 200 4
123 210 5
Hier der Algorithmus, der aus einer Zahl die korrespondierende Permutation erstellt. Die Umkehrfunktion (Permutation->Index) kannst Du nach o.g. Schema leicht selbst implementieren.
Delphi-Quellcode:
Function NthPermutation (aString : String; aCount : Integer) : String;
Var
d : Array Of Integer;
g, i, n : Integer;
Begin
n := Length (aString);
setlength (d, n);
d[1] := 1;
For i := 2 to n - 1 do d[i] := i * d[i-1];
Result := '';
for i := n-1 downto 1 do begin
g := (aCount div d[i]) + 1;
Result := Result + aString[g];
delete (aString, g, 1);
aCount := aCount mod d[i];
End;
Result := Result + aString;
End;