用于字符串数组的delphi mergesort

用于字符串数组的delphi mergesort,第1张

用于字符串数组的delphi mergesort

回答第二个问题:带有重复删除的Mergesort修改。应该适用于字符串。

//returns new valid lengthfunction MergeSortRemoveDuplicates(var Vals: array of Integer):Integer;var  AVals: array of Integer;   //returns index of the last valid element  function Merge(I0, I1, J0, J1: Integer):Integer;  var    i, j, k, LC:Integer;  begin    LC := I1 - I0;    for i := 0 to LC do      AVals[i]:=Vals[i + I0];      //copy lower half or Vals into temporary array AVals    k := I0;    i := 0;    j := J0;    while ((i <= LC) and (j <= J1)) do    if (AVals[i] < Vals[j]) then begin      Vals[k] := AVals[i];      inc(i);      inc(k);    end else  if (AVals[i] > Vals[j]) then begin      Vals[k]:=Vals[j];      inc(k);      inc(j);    end else begin //duplicate      Vals[k] := AVals[i];      inc(i);      inc(j);      inc(k);    end;    //copy the rest    while i <= LC do begin      Vals[k] := AVals[i];      inc(i);      inc(k);    end;    if k <> j then      while j <= J1 do begin        Vals[k]:=Vals[j];        inc(k);        inc(j);      end;    Result := k - 1;  end; //returns index of the last valid element  function PerformMergeSort(ALo, AHi:Integer): Integer; //returns  var    AMid, I1, J1:Integer;  begin  //It would be wise to use Insertion Sort when (AHi - ALo) is small (about 32-100)    if (ALo < AHi) then    begin      AMid:=(ALo + AHi) shr 1;      I1 := PerformMergeSort(ALo, AMid);      J1 := PerformMergeSort(AMid + 1, AHi);      Result := Merge(ALo, I1, AMid + 1, J1);    end else      Result := ALo;  end;begin  SetLength(AVals, Length(Vals) div 2 + 1);  Result := 1 + PerformMergeSort(0, High(Vals));end;//short testvar  A: array of Integer;  i, NewLen: Integer;begin  Randomize;  SetLength(A, 12);  for i := 0 to High(A) do    A[i] := Random(10);   NewLen := MergeSortRemoveDuplicates(A);   SetLength(A, NewLen);   for i := 0 to High(A) do     Memo1.Lines.Add(IntToStr(A[i]))  end;

字符串的简单修改:

function MergeSortRemoveDuplicates(var Vals: array of String):Integer;var  AVals: array of String;

和测试用例:

var  List: TStringList;  Arr: array of string;  i, n: Integer;begin  with TStringList.Create do try    LoadFromFile('F:m2.txt'); //contains some equal strings    SetLength(Arr, Count);    for i := 0 to Count - 1 do      Arr[i] := Strings[i];  finally    Free  end;  n := MergeSortRemoveDuplicates(Arr);  for i := 0 to n - 1 do    Memo1.Lines.Add(Arr[i]);end;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5652443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存