Janilabo

Janilabo | TSAMergeSortBU() [Simba]

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