首先说明,这并不是解。
只是我为交换作为约束条件的算法,时间复杂度比O
大。
var
a: array of Integer;
Num, Half, SwapTimes: Integer;
procedure Swap(x, y: Integer);
var Temp: integer;
begin
Temp := a[x];
a[x] := a[y];
a[y] := Temp;
Inc(SwapTimes);
end;
procedure SwapStep(i, Step: Integer);
begin
Swap(i, i + Step);
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
Num := StrToInt(TEdit(Sender).Text);
Half := (Num + 1) div 2;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text := '100';
ActiveControl := Edit1;
end;
procedure TForm1.Button1Click(Sender: TObject);
procedure Sort(aStart, aTo: integer);
var
i, Step: Integer;
begin
Step := (aTo - aStart - 1) div 4 * 2 + 1;
for i := 0 to (aTo - aStart + 1) div 4do
SwapStep(aStart + i * 2, Step);
if aTo - aStart > 3 then
begin
if (aTo - aStart + 1) mod 4 = 0 then
SwapStep((aStart + aTo) div 2, 1);
Sort(aStart, aStart + Step - 2);
Sort(aTo - Step + 2, aTo);
end;
end;
{ procedure Sort2(aStart, aTo: integer);
var
i, Step: Integer;
begin
Step := (aTo - aStart + 1) div 4 * 2 + 1;
for i := 0 to (aTo - aStart - 1) div 4do
SwapStep(aStart + i * 2, Step);
if aTo - aStart > 1 then
begin
Sort2(aStart, aStart + Step - 2);
Sort2(aTo - Step + 2, aTo);
end;
end;
}
var
i: integer;
TempStr: String;
begin
if Num < 2 then
Exit;
SwapTimes := 0;
a := nil;
SetLength(a, Num + 1);
for i := 1 to Numdo
a
:= i;
Sort(2, Half * 2 - 1);
// Sort2(2, Half * 2 - 1);
TempStr := IntToStr(SwapTimes) + ' > ';
for i := 1 to Numdo
TempStr := TempStr + Format('%3d', [a]);
Memo1.Lines.Add(TempStr);
end;
其中 Sort1 用的交换次数较少,而 Sort2 用的时间可能较少。
用的是 交换定长,反中序二叉递归算法。