Delphi Mergesort для строковых массивов [закрыто]
Найдено это закодированное слияние на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?)and preserve original order if possible for later resorting it back to original index position minus the duplicates of course (original index) поэтому массив может быть передан обратно для дальнейшей обработки. Я использую очень большие файлы строк с миллионами строк (от 14 до 30 миллионов), поэтому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;