Janilabo

Janilabo | TSAQuickSort2() [Simba]

May 21st, 2013
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.68 KB | None | 0 0
  1. procedure __TSA_LH_QS2(TSA: TStringArray; Lo, Hi: Integer);
  2. var
  3.   L, R: Integer;
  4.   C, T: string;
  5. begin
  6.   repeat
  7.     case ((Hi - Lo) > 16) of
  8.       True:
  9.       begin
  10.         C := TSA[((Hi + Lo) shr 1)];
  11.         L := Lo;
  12.         R := Hi;
  13.         repeat
  14.           while (TSA[L] < C) do
  15.             Inc(L);
  16.           while (TSA[R] > C) do
  17.             Dec(R);
  18.           if (L <= R) then
  19.           begin
  20.             if (L <> R) then
  21.             begin
  22.               T := TSA[L];
  23.               TSA[L] := TSA[R];
  24.               TSA[R] := T;
  25.             end;
  26.             Inc(L);
  27.             Dec(R);
  28.           end;
  29.         until (R < L);
  30.         if (R > Lo) then
  31.           __TSA_LH_QS2(TSA, Lo, R);
  32.         Lo := L;
  33.       end;
  34.       False:
  35.       begin
  36.         for L := (Lo + 1) to Hi do
  37.         begin
  38.           T := TSA[L];
  39.           R := L;
  40.           while ((R > Lo) and (TSA[(R - 1)] > T)) do
  41.           begin
  42.             TSA[R] := TSA[(R - 1)];
  43.             Dec(R);
  44.           end;
  45.           TSA[R] := T;
  46.         end;
  47.         Exit;
  48.       end;
  49.     end;
  50.   until (Hi <= L);
  51. end;
  52.  
  53. procedure __TSA_HL_QS2(TSA: TStringArray; Lo, Hi: Integer);
  54. var
  55.   L, R: Integer;
  56.   C, T: string;
  57. begin
  58.   repeat
  59.     case ((Hi - Lo) > 16) of
  60.       True:
  61.       begin
  62.         C := TSA[((Hi + Lo) shr 1)];
  63.         L := Lo;
  64.         R := Hi;
  65.         repeat
  66.           while (TSA[L] > C) do
  67.             Inc(L);
  68.           while (TSA[R] < C) do
  69.             Dec(R);
  70.           if (L <= R) then
  71.           begin
  72.             if (L <> R) then
  73.             begin
  74.               T := TSA[L];
  75.               TSA[L] := TSA[R];
  76.               TSA[R] := T;
  77.             end;
  78.             Inc(L);
  79.             Dec(R);
  80.           end;
  81.         until (R < L);
  82.         if (R > Lo) then
  83.           __TSA_HL_QS2(TSA, Lo, R);
  84.         Lo := L;
  85.       end;
  86.       False:
  87.       begin
  88.         for L := (Lo + 1) to Hi do
  89.         begin
  90.           T := TSA[L];
  91.           R := L;
  92.           while ((R > Lo) and (TSA[(R - 1)] < T)) do
  93.           begin
  94.             TSA[R] := TSA[(R - 1)];
  95.             Dec(R);
  96.           end;
  97.           TSA[R] := T;
  98.         end;
  99.         Exit;
  100.       end;
  101.     end;
  102.   until (Hi <= L);
  103. end;
  104.  
  105. procedure TSAQuickSort2(TSA: TStringArray; order: (so_LowToHigh, so_HighToLow));
  106. var
  107.   h: Integer;
  108. begin
  109.   h := High(TSA);
  110.   if (h > 0) then
  111.   case order of
  112.     so_LowToHigh: __TSA_LH_QS2(TSA, 0, h);
  113.     so_HighToLow: __TSA_HL_QS2(TSA, 0, h);
  114.   end;
  115. end;
  116.  
  117. var
  118.   TSA: TStringArray;
  119.  
  120. begin
  121.   TSA := ['Apple', 'Orange', 'Lemon', 'Banana', 'Pear'];
  122.   TSAQuickSort2(TSA, so_HighToLow); // Reversed.
  123.   WriteLn(ToStr(TSA));
  124.   TSAQuickSort2(TSA, so_LowToHigh); // Default.
  125.   WriteLn(ToStr(TSA));
  126. end.
Advertisement
Add Comment
Please, Sign In to add comment