16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:マージソート修正"
この発言は #00242 べあ さんのソート3種 に対するコメントです
マージソートのコードにミスがあったようです。で、修正版です。
type
TMergeList = class(TList)
public
procedure Sort(Compare: TListSortCompare);
end;
{ TListのSortメッソドを上書きしてしまいましょう。こうすれば、ほかでも
このクラスを利用できます。また、クイックソートの方がいい場合TListに
キャストしてやれば、クイックソートになります}
implementation
procedure TMergeList.Sort(Compare: TListSortCompare);
var Tmp:PPointerList;
procedure MergeSort(First,Last: Integer);
var
I,J,K,P,Mid:Integer;
begin
if First < Last then begin
Mid :=(First + Last) div 2;
MergeSort(First,Mid);
MergeSort(Mid+1,Last);
P := Mid - First + 1;
System.Move(List^[First],Tmp^[0], P * SizeOf(Pointer) );
i := Mid + 1; J := 0 ; k := first;
while (i <= Last) and (J < P) do
if Compare(Tmp^[J],List^[I]) > 0
then begin
List^[k] := List^[i];
//後半から書き戻す。
Inc(k);Inc(i);
end else begin
List^[k] := Tmp^[j];
//作業領域から書き戻す。ここ、間違ってました。m(__)m
Inc(k);Inc(J);
end;
while j < P do begin
List^[K] := Tmp^[j];
inc(k);inc(j);
end;
end;
end;
begin
GetMem(Tmp,(count div 2 + 1) * SizeOf(Pointer));
try
MergeSort(0,Count-1);
finally
FreeMem(Tmp);
end;
end;
97/12/20(土) 16:53 べあ(BYI15773)
Original document by べあ 氏 ID:(BYI15773)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|