此代碼置換整數數組,但我不確定它是否最優(可能不是)。
type
TDynIntegerArray = array of integer;
procedure PermuteArray(A: TDynIntegerArray);
var
B: TDynIntegerArray;
Z: TDynIntegerArray;
π: TDynIntegerArray;
i: Integer;
j: Integer;
k: Integer;
begin
B := Copy(A);
SetLength(Z, Length(A));
SetLength(π, Length(A));
for i := 0 to High(Z) do
Z[i] := i;
for i := 0 to High(π) do
begin
π[i] := RandomFrom(Z);
for j := 0 to High(Z) do
begin
if Z[j] = π[i] then
begin
for k := j to High(Z) - 1 do
Z[k] := Z[k+1];
SetLength(Z, length(Z) - 1);
break;
end;
end;
end;
for i := 0 to High(A) do
A[i] := B[π[i]];
end;
快得多,但不冷靜的做法是簡單地隨機交換項目,一對在一個時間:
procedure FastPermuteArray(A: TDynIntegerArray);
procedure Swap(n, m: integer);
var
tmp: integer;
begin
tmp := A[n];
A[n] := A[m];
A[m] := tmp;
end;
var
i: Integer;
begin
for i := High(A) downto 1 do
Swap(i, RandomRange(0, i));
end;
你可以隨機交換/洗牌陣列中的元素。 – kobik 2013-03-10 16:11:45
所以你的問題是[如何洗牌數組值](http://delphi.about.com/cs/adptips2003/a/bltip1003_4.htm)? – TLama 2013-03-10 16:12:58
您的代碼沒有意義... – 2013-03-10 16:13:59