Janilabo

Janilabo | TSAMergeSort() [Simba]

May 21st, 2013
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.01 KB | None | 0 0
  1. procedure __TSA_LH_M(var TSA, tmp: TStringArray; const Lo, Hi: Integer);
  2. var
  3.   L, R, i, m: Integer;
  4. begin
  5.   if (Lo >= Hi) then
  6.     Exit;
  7.   m := (Lo + (Hi - Lo) div 2);
  8.   __TSA_LH_M(TSA, tmp, Lo, m);
  9.   __TSA_LH_M(TSA, tmp, (m + 1), Hi);
  10.   L := Lo;
  11.   R := (m + 1);
  12.   for i := Lo to Hi do
  13.     tmp[i] := TSA[i];
  14.   for i := Lo to Hi do
  15.     if (L > m) then
  16.     begin
  17.       TSA[i] := tmp[R];
  18.       Inc(R);
  19.     end else
  20.       if (R > Hi) then
  21.       begin
  22.         TSA[i] := tmp[L];
  23.         Inc(L);
  24.       end else
  25.         if (tmp[R] < tmp[L]) then
  26.         begin
  27.           TSA[i] := tmp[R];
  28.           Inc(R);
  29.         end else
  30.         begin
  31.           TSA[i] := tmp[L];
  32.           Inc(L);
  33.         end;
  34. end;
  35.  
  36. procedure __TSA_HL_M(var TSA, tmp: TStringArray; const Lo, Hi: Integer);
  37. var
  38.   L, R, i, m: Integer;
  39. begin
  40.   if (Lo >= Hi) then
  41.     Exit;
  42.   m := (Lo + (Hi - Lo) div 2);
  43.   __TSA_HL_M(TSA, tmp, Lo, m);
  44.   __TSA_HL_M(TSA, tmp, (m + 1), Hi);
  45.   L := Lo;
  46.   R := (m + 1);
  47.   for i := Lo to Hi do
  48.     tmp[i] := TSA[i];
  49.   for i := Lo to Hi do
  50.     if (L > m) then
  51.     begin
  52.       TSA[i] := tmp[R];
  53.       Inc(R);
  54.     end else
  55.       if (R > Hi) then
  56.       begin
  57.         TSA[i] := tmp[L];
  58.         Inc(L);
  59.       end else
  60.         if (tmp[R] > tmp[L]) then
  61.         begin
  62.           TSA[i] := tmp[R];
  63.           Inc(R);
  64.         end else
  65.         begin
  66.           TSA[i] := tmp[L];
  67.           Inc(L);
  68.         end;
  69. end;
  70.  
  71. procedure TSAMergeSort(var TSA: TStringArray; order: (so_LowToHigh, so_HighToLow));
  72. var
  73.   l: Integer;
  74.   t: TStringArray;
  75. begin
  76.   l := Length(TSA);
  77.   if (l > 1) then
  78.   begin
  79.     SetLength(t, l);
  80.     case order of
  81.       so_LowToHigh: __TSA_LH_M(TSA, t, 0, (l - 1));
  82.       so_HighToLow: __TSA_HL_M(TSA, t, 0, (l - 1));
  83.     end;
  84.   end;
  85. end;
  86.  
  87. var
  88.   TSA: TStringArray;
  89.  
  90. begin
  91.   TSA := ['Apple', 'Orange', 'Lemon', 'Banana', 'Pear'];
  92.   TSAMergeSort(TSA, so_HighToLow); // Reversed.
  93.   WriteLn(ToStr(TSA));
  94.   TSAMergeSort(TSA, so_LowToHigh); // Default.
  95.   WriteLn(ToStr(TSA));
  96. end.
Advertisement
Add Comment
Please, Sign In to add comment