Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Answer to the second question: Mergesort modification with duplicate deleting. Should work for strings.</p> <pre><code>//returns new valid length function 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 &lt;= LC) and (j &lt;= J1)) do if (AVals[i] &lt; Vals[j]) then begin Vals[k] := AVals[i]; inc(i); inc(k); end else if (AVals[i] &gt; 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 &lt;= LC do begin Vals[k] := AVals[i]; inc(i); inc(k); end; if k &lt;&gt; j then while j &lt;= 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 &lt; 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 test var 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; </code></pre> <p>Simple modification for strings:</p> <pre><code>function MergeSortRemoveDuplicates(var Vals: array of String):Integer; var AVals: array of String; </code></pre> <p>and test case:</p> <pre><code>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; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload