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 это не вариант. Лучшим вариантом для этих больших файлов является использование массивов строк или массивов записей (или, может быть, одного связанного списка ??) и сортировка с использованием стабильного алгоритма, созданного для большого объема данных.

How can I change this to take array of string? How can it be further modified to delete or at least mark duplicates? Is it possible to store original index number to place back strings in original position? Are arrays of string or arrays of record better for large number of strings as compared to a single linked list?

Вопросы перечислены в порядке важности, поэтому, если вы ответите на вопрос № 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;

Ответы на вопрос(2)

Ваш ответ на вопрос