このコード化されたマージソートはhttp://www.explainth.at/en/delphi/dsort.shtmlで見つかりました(サイトはダウンしていますが、ウェイバックマシンまたはこのサイトを試してください:http://read.pudn.com/downloads192/sourcecode/delphi_control/901147 /Sorts.pas__.htm)が、基本的に定義された配列は文字列の配列用ではありませんでした。
type TSortArray = array[0..8191] of Double;
重複を排除する可能性のある文字列の配列(これはUnionですか?)を渡し、可能であれば元の順序を保持して、後で元のインデックス位置から重複を差し引いたもの(元のインデックス)に戻して、配列を戻すことができるようにしたいさらなる処理のために。私は数百万の文字列(1400万から3000万)を含む非常に大きな文字列ファイルを使用しています。TStringList
オプションではありません。これらの大きなファイルに最適なオプションは、文字列の配列またはレコードの配列(または単一のリンクリスト??)を使用し、大量のデータ用に作成された安定したアルゴリズムで並べ替えることです。
- 文字列の配列を取るようにこれを変更するにはどうすればよいですか?
- 重複を削除または少なくともマークするようにさらに変更するにはどうすればよいですか?
- 元のインデックス番号を保存して、文字列を元の位置に戻すことはできますか?
- 単一のリンクリストと比較して、文字列の配列またはレコードの配列は、多数の文字列に対して優れていますか?
質問は重要度の高い順にリストされているので、質問番号1に答える場合は、それだけで問題ありません。よろしくお願いします。
procedure MergeSort(var Vals:TSortArray;ACount:Integer);
var AVals:TSortArray;
procedure Merge(ALo,AMid,AHi:Integer);
var i,j,k,m:Integer;
begin
i:=0;
for j:=ALo to AMid do
begin
AVals[i]:=Vals[j];
inc(i);
//copy lower half or Vals into temporary array AVals
end;
i:=0;j:=AMid + 1;k:=ALo;//j could be undefined after the for loop!
while ((k < j) and (j <= AHi)) do
if (AVals[i] < Vals[j]) then
begin
Vals[k]:=AVals[i];
inc(i);inc(k);
end else
begin
Vals[k]:=Vals[j];
inc(k);inc(j);
end;
{locate next greatest value in Vals or AVals and copy it to the
right position.}
for m:=k to j - 1 do
begin
Vals[m]:=AVals[i];
inc(i);
end;
//copy back any remaining, unsorted, elements
end;
procedure PerformMergeSort(ALo,AHi:Integer);
var AMid:Integer;
begin
if (ALo < AHi) then
begin
AMid:=(ALo + AHi) shr 1;
PerformMergeSort(ALo,AMid);
PerformMergeSort(AMid + 1,AHi);
Merge(ALo,AMid,AHi); <==== passing the array as string causes AV breakdown here
end;
end;
begin
SetLength(AVals, ACount);
PerformMergeSort(0,ACount - 1);
end;