Janilabo

sortingLib (Example) [Simba]

May 17th, 2013
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 67.24 KB | None | 0 0
  1. {==============================================================================]
  2.           (* = I, S, E, C) ~~~ (? = Integer, String, Extended, Char)
  3.  
  4.    • procedure T*AJnlbSort(var T*A: T?Array; order: TSortOrder);
  5.    • procedure T*AJnlbSortDnmc(var T*A: T?Array; order: TSortOrder);
  6.    • procedure T*ABubbleSort(var T*A: T?Array; order: TSortOrder);
  7.    • procedure T*AInsertionSort(var T*A: T?Array; order: TSortOrder);
  8.    • procedure T*AShellSort(var T*A: T?Array; order: TSortOrder);
  9.    • procedure T*ASelectionSort(var T*A: T?Array; order: TSortOrder);
  10.    • procedure T*AHeapSort(var T*A: T?Array; order: TSortOrder);
  11.    • procedure T*AQuickSort(var T*A: T?Array; order: TSortOrder);
  12.    • procedure T*AQuickSort3W(var T*A: T?Array; order: TSortOrder);
  13.    • procedure T*AMergeSort(var T*A: T?Array; order: TSortOrder);
  14.    • procedure T*AMergeSortBU(var T*A: T?Array; order: TSortOrder);
  15.    • procedure T*ASort(var T*A: T?Array; algorithm: TSortAlgorithm; order: TSortOrder);
  16. {==============================================================================}
  17.  
  18. type
  19.   TSortOrder = (so_LowToHigh, so_HighToLow);
  20.  
  21. type
  22.   TSortAlgorithm = (sa_BubbleSort, sa_HeapSort, sa_InsertionSort,
  23.                     sa_MergeSort, sa_MergeSortBU, sa_SelectionSort,
  24.                     sa_ShellSort, sa_QuickSort, sa_QuickSort3W,
  25.                     sa_JnlbSort, sa_JnlbSortDnmc);
  26.  
  27. procedure TIAJnlbSort(var TIA: TIntegerArray; order: TSortOrder);
  28. var
  29.   a, b, x, i, l, hi, lo, s: Integer;
  30. begin
  31.   l := Length(TIA);
  32.   if (l > 1) then
  33.   begin
  34.     s := ((l - 1) div 2);
  35.     case order of
  36.       so_LowToHigh:
  37.       for i := 0 to s do
  38.       begin
  39.         lo := i;
  40.         hi := ((l - 1) - i);
  41.         a := lo;
  42.         b := hi;
  43.         if (TIA[hi] < TIA[lo]) then
  44.           Swap(TIA[hi], TIA[lo]);
  45.         for x := (a + 1) to (b - 1) do
  46.           if (TIA[x] < TIA[lo]) then
  47.             lo := x
  48.           else
  49.             if (TIA[x] > TIA[hi]) then
  50.               hi := x;
  51.         if (lo > a) then
  52.           Swap(TIA[a], TIA[lo]);
  53.         if (hi < b) then
  54.           Swap(TIA[b], TIA[hi]);
  55.       end;
  56.       so_HighToLow:
  57.       for i := 0 to s do
  58.       begin
  59.         lo := i;
  60.         hi := ((l - 1) - i);
  61.         a := lo;
  62.         b := hi;
  63.         if (TIA[hi] > TIA[lo]) then
  64.           Swap(TIA[hi], TIA[lo]);
  65.         for x := (a + 1) to (b - 1) do
  66.           if (TIA[x] > TIA[lo]) then
  67.             lo := x
  68.           else
  69.             if (TIA[x] < TIA[hi]) then
  70.               hi := x;
  71.         if (lo < a) then
  72.           Swap(TIA[a], TIA[lo]);
  73.         if (hi > b) then
  74.           Swap(TIA[b], TIA[hi]);
  75.       end;
  76.     end;
  77.   end;
  78. end;
  79.  
  80. procedure TSAJnlbSort(var TSA: TStringArray; order: TSortOrder);
  81. var
  82.   a, b, x, i, l, hi, lo, s: Integer;
  83. begin
  84.   l := Length(TSA);
  85.   if (l > 1) then
  86.   begin
  87.     s := ((l - 1) div 2);
  88.     case order of
  89.       so_LowToHigh:
  90.       for i := 0 to s do
  91.       begin
  92.         lo := i;
  93.         hi := ((l - 1) - i);
  94.         a := lo;
  95.         b := hi;
  96.         if (TSA[hi] < TSA[lo]) then
  97.           Swap(TSA[hi], TSA[lo]);
  98.         for x := (a + 1) to (b - 1) do
  99.           if (TSA[x] < TSA[lo]) then
  100.             lo := x
  101.           else
  102.             if (TSA[x] > TSA[hi]) then
  103.               hi := x;
  104.         if (lo > a) then
  105.           Swap(TSA[a], TSA[lo]);
  106.         if (hi < b) then
  107.           Swap(TSA[b], TSA[hi]);
  108.       end;
  109.       so_HighToLow:
  110.       for i := 0 to s do
  111.       begin
  112.         lo := i;
  113.         hi := ((l - 1) - i);
  114.         a := lo;
  115.         b := hi;
  116.         if (TSA[hi] > TSA[lo]) then
  117.           Swap(TSA[hi], TSA[lo]);
  118.         for x := (a + 1) to (b - 1) do
  119.           if (TSA[x] > TSA[lo]) then
  120.             lo := x
  121.           else
  122.             if (TSA[x] < TSA[hi]) then
  123.               hi := x;
  124.         if (lo < a) then
  125.           Swap(TSA[a], TSA[lo]);
  126.         if (hi > b) then
  127.           Swap(TSA[b], TSA[hi]);
  128.       end;
  129.     end;
  130.   end;
  131. end;
  132.  
  133. procedure TEAJnlbSort(var TEA: TExtendedArray; order: TSortOrder);
  134. var
  135.   a, b, x, i, l, hi, lo, s: Integer;
  136. begin
  137.   l := Length(TEA);
  138.   if (l > 1) then
  139.   begin
  140.     s := ((l - 1) div 2);
  141.     case order of
  142.       so_LowToHigh:
  143.       for i := 0 to s do
  144.       begin
  145.         lo := i;
  146.         hi := ((l - 1) - i);
  147.         a := lo;
  148.         b := hi;
  149.         if (TEA[hi] < TEA[lo]) then
  150.           Swap(TEA[hi], TEA[lo]);
  151.         for x := (a + 1) to (b - 1) do
  152.           if (TEA[x] < TEA[lo]) then
  153.             lo := x
  154.           else
  155.             if (TEA[x] > TEA[hi]) then
  156.               hi := x;
  157.         if (lo > a) then
  158.           Swap(TEA[a], TEA[lo]);
  159.         if (hi < b) then
  160.           Swap(TEA[b], TEA[hi]);
  161.       end;
  162.       so_HighToLow:
  163.       for i := 0 to s do
  164.       begin
  165.         lo := i;
  166.         hi := ((l - 1) - i);
  167.         a := lo;
  168.         b := hi;
  169.         if (TEA[hi] > TEA[lo]) then
  170.           Swap(TEA[hi], TEA[lo]);
  171.         for x := (a + 1) to (b - 1) do
  172.           if (TEA[x] > TEA[lo]) then
  173.             lo := x
  174.           else
  175.             if (TEA[x] < TEA[hi]) then
  176.               hi := x;
  177.         if (lo < a) then
  178.           Swap(TEA[a], TEA[lo]);
  179.         if (hi > b) then
  180.           Swap(TEA[b], TEA[hi]);
  181.       end;
  182.     end;
  183.   end;
  184. end;
  185.  
  186. procedure TCAJnlbSort(var TCA: array of Char; order: TSortOrder);
  187. var
  188.   a, b, x, i, l, hi, lo, s: Integer;
  189.   t: Char;
  190. begin
  191.   l := Length(TCA);
  192.   if (l > 1) then
  193.   begin
  194.     s := ((l - 1) div 2);
  195.     case order of
  196.       so_LowToHigh:
  197.       for i := 0 to s do
  198.       begin
  199.         lo := i;
  200.         hi := ((l - 1) - i);
  201.         a := lo;
  202.         b := hi;
  203.         if (TCA[hi] < TCA[lo]) then
  204.         begin
  205.           t := TCA[hi];
  206.           TCA[hi] := TCA[lo];
  207.           TCA[lo] := t;
  208.         end;
  209.         for x := (a + 1) to (b - 1) do
  210.           if (TCA[x] < TCA[lo]) then
  211.             lo := x
  212.           else
  213.             if (TCA[x] > TCA[hi]) then
  214.               hi := x;
  215.         if (lo > a) then
  216.         begin
  217.           t := TCA[a];
  218.           TCA[a] := TCA[lo];
  219.           TCA[lo] := t;
  220.         end;
  221.         if (hi < b) then
  222.         begin
  223.           t := TCA[b];
  224.           TCA[b] := TCA[hi];
  225.           TCA[hi] := t;
  226.         end;
  227.       end;
  228.       so_HighToLow:
  229.       for i := 0 to s do
  230.       begin
  231.         lo := i;
  232.         hi := ((l - 1) - i);
  233.         a := lo;
  234.         b := hi;
  235.         if (TCA[hi] > TCA[lo]) then
  236.         begin
  237.           t := TCA[hi];
  238.           TCA[hi] := TCA[lo];
  239.           TCA[lo] := t;
  240.         end;
  241.         for x := (a + 1) to (b - 1) do
  242.           if (TCA[x] > TCA[lo]) then
  243.             lo := x
  244.           else
  245.             if (TCA[x] < TCA[hi]) then
  246.               hi := x;
  247.         if (lo < a) then
  248.         begin
  249.           t := TCA[a];
  250.           TCA[a] := TCA[lo];
  251.           TCA[lo] := t;
  252.         end;
  253.         if (hi > b) then
  254.         begin
  255.           t := TCA[b];
  256.           TCA[b] := TCA[hi];
  257.           TCA[hi] := t;
  258.         end;
  259.       end;
  260.     end;
  261.   end;
  262. end;
  263.  
  264. procedure TIAJnlbSortDnmc(var TIA: TIntegerArray; order: TSortOrder);
  265. var
  266.   a, b, x, i, l, s: Integer;
  267. begin
  268.   l := Length(TIA);
  269.   if (l > 1) then
  270.   begin
  271.     s := ((l - 1) div 2);
  272.     case order of
  273.       so_LowToHigh:
  274.       for i := 0 to s do
  275.       begin
  276.         a := i;
  277.         b := ((l - 1) - i);
  278.         if (TIA[b] < TIA[a]) then
  279.           Swap(TIA[b], TIA[a]);
  280.         for x := (a + 1) to (b - 1) do
  281.           if (TIA[x] < TIA[a]) then
  282.             Swap(TIA[x], TIA[a])
  283.           else
  284.             if (TIA[x] > TIA[b]) then
  285.               Swap(TIA[x], TIA[b]);
  286.       end;
  287.       so_HighToLow:
  288.       for i := 0 to s do
  289.       begin
  290.         a := i;
  291.         b := ((l - 1) - i);
  292.         if (TIA[a] > TIA[b]) then
  293.           Swap(TIA[a], TIA[b]);
  294.         for x := (a + 1) to (b - 1) do
  295.           if (TIA[x] > TIA[a]) then
  296.             Swap(TIA[x], TIA[a])
  297.           else
  298.             if (TIA[x] < TIA[b]) then
  299.               Swap(TIA[x], TIA[b]);
  300.       end;
  301.     end;
  302.   end;
  303. end;
  304.  
  305. procedure TSAJnlbSortDnmc(var TSA: TStringArray; order: TSortOrder);
  306. var
  307.   a, b, x, i, l, s: Integer;
  308. begin
  309.   l := Length(TSA);
  310.   if (l > 1) then
  311.   begin
  312.     s := ((l - 1) div 2);
  313.     case order of
  314.       so_LowToHigh:
  315.       for i := 0 to s do
  316.       begin
  317.         a := i;
  318.         b := ((l - 1) - i);
  319.         if (TSA[b] < TSA[a]) then
  320.           Swap(TSA[b], TSA[a]);
  321.         for x := (a + 1) to (b - 1) do
  322.           if (TSA[x] < TSA[a]) then
  323.             Swap(TSA[x], TSA[a])
  324.           else
  325.             if (TSA[x] > TSA[b]) then
  326.               Swap(TSA[x], TSA[b]);
  327.       end;
  328.       so_HighToLow:
  329.       for i := 0 to s do
  330.       begin
  331.         a := i;
  332.         b := ((l - 1) - i);
  333.         if (TSA[a] > TSA[b]) then
  334.           Swap(TSA[a], TSA[b]);
  335.         for x := (a + 1) to (b - 1) do
  336.           if (TSA[x] > TSA[a]) then
  337.             Swap(TSA[x], TSA[a])
  338.           else
  339.             if (TSA[x] < TSA[b]) then
  340.               Swap(TSA[x], TSA[b]);
  341.       end;
  342.     end;
  343.   end;
  344. end;
  345.  
  346. procedure TEAJnlbSortDnmc(var TEA: TExtendedArray; order: TSortOrder);
  347. var
  348.   a, b, x, i, l, s: Integer;
  349. begin
  350.   l := Length(TEA);
  351.   if (l > 1) then
  352.   begin
  353.     s := ((l - 1) div 2);
  354.     case order of
  355.       so_LowToHigh:
  356.       for i := 0 to s do
  357.       begin
  358.         a := i;
  359.         b := ((l - 1) - i);
  360.         if (TEA[b] < TEA[a]) then
  361.           Swap(TEA[b], TEA[a]);
  362.         for x := (a + 1) to (b - 1) do
  363.           if (TEA[x] < TEA[a]) then
  364.             Swap(TEA[x], TEA[a])
  365.           else
  366.             if (TEA[x] > TEA[b]) then
  367.               Swap(TEA[x], TEA[b]);
  368.       end;
  369.       so_HighToLow:
  370.       for i := 0 to s do
  371.       begin
  372.         a := i;
  373.         b := ((l - 1) - i);
  374.         if (TEA[a] > TEA[b]) then
  375.           Swap(TEA[a], TEA[b]);
  376.         for x := (a + 1) to (b - 1) do
  377.           if (TEA[x] > TEA[a]) then
  378.             Swap(TEA[x], TEA[a])
  379.           else
  380.             if (TEA[x] < TEA[b]) then
  381.               Swap(TEA[x], TEA[b]);
  382.       end;
  383.     end;
  384.   end;
  385. end;
  386.  
  387. procedure TCAJnlbSortDnmc(var TCA: array of Char; order: TSortOrder);
  388. var
  389.   a, b, x, i, l, s: Integer;
  390.   t: Char;
  391. begin
  392.   l := Length(TCA);
  393.   if (l > 1) then
  394.   begin
  395.     s := ((l - 1) div 2);
  396.     case order of
  397.       so_LowToHigh:
  398.       for i := 0 to s do
  399.       begin
  400.         a := i;
  401.         b := ((l - 1) - i);
  402.         if (TCA[b] < TCA[a]) then
  403.         begin
  404.           t := TCA[b];
  405.           TCA[b] := TCA[a];
  406.           TCA[a] := t;
  407.         end;
  408.         for x := (a + 1) to (b - 1) do
  409.           if (TCA[x] < TCA[a]) then
  410.           begin
  411.             t := TCA[x];
  412.             TCA[x] := TCA[a];
  413.             TCA[a] := t;
  414.           end else
  415.             if (TCA[x] > TCA[b]) then
  416.             begin
  417.               t := TCA[x];
  418.               TCA[x] := TCA[b];
  419.               TCA[b] := t;
  420.             end;
  421.       end;
  422.       so_HighToLow:
  423.       for i := 0 to s do
  424.       begin
  425.         a := i;
  426.         b := ((l - 1) - i);
  427.         if (TCA[a] > TCA[b]) then
  428.         begin
  429.           t := TCA[a];
  430.           TCA[a] := TCA[b];
  431.           TCA[b] := t;
  432.         end;
  433.         for x := (a + 1) to (b - 1) do
  434.           if (TCA[x] > TCA[a]) then
  435.           begin
  436.             t := TCA[x];
  437.             TCA[x] := TCA[a];
  438.             TCA[a] := t;
  439.           end else
  440.             if (TCA[x] < TCA[b]) then
  441.             begin
  442.               t := TCA[x];
  443.               TCA[x] := TCA[b];
  444.               TCA[b] := t;
  445.             end;
  446.       end;
  447.     end;
  448.   end;
  449. end;
  450.  
  451. procedure TIABubbleSort(var TIA: TIntegerArray; order: TSortOrder);
  452. var
  453.   a, b, h: Integer;
  454. begin
  455.   h := High(TIA);
  456.   if (h > 0) then
  457.   case order of
  458.     so_LowToHigh:
  459.     for a := 0 to h do
  460.       for b := 1 to (h - a) do
  461.         if (TIA[(b - 1)] > TIA[b]) then
  462.           Swap(TIA[(b - 1)], TIA[b]);
  463.     so_HighToLow:
  464.     for a := 0 to h do
  465.       for b := 1 to (h - a) do
  466.         if (TIA[(b - 1)] < TIA[b]) then
  467.           Swap(TIA[(b - 1)], TIA[b]);
  468.   end;
  469. end;
  470.  
  471. procedure TSABubbleSort(var TSA: TStringArray; order: TSortOrder);
  472. var
  473.   a, b, h: Integer;
  474. begin
  475.   h := High(TSA);
  476.   if (h > 0) then
  477.   case order of
  478.     so_LowToHigh:
  479.     for a := 0 to h do
  480.       for b := 1 to (h - a) do
  481.         if (TSA[(b - 1)] > TSA[b]) then
  482.           Swap(TSA[(b - 1)], TSA[b]);
  483.     so_HighToLow:
  484.     for a := 0 to h do
  485.       for b := 1 to (h - a) do
  486.         if (TSA[(b - 1)] < TSA[b]) then
  487.           Swap(TSA[(b - 1)], TSA[b]);
  488.   end;
  489. end;
  490.  
  491. procedure TEABubbleSort(var TEA: TExtendedArray; order: TSortOrder);
  492. var
  493.   a, b, h: Integer;
  494. begin
  495.   h := High(TEA);
  496.   if (h > 0) then
  497.   case order of
  498.     so_LowToHigh:
  499.     for a := 0 to h do
  500.       for b := 1 to (h - a) do
  501.         if (TEA[(b - 1)] > TEA[b]) then
  502.           Swap(TEA[(b - 1)], TEA[b]);
  503.     so_HighToLow:
  504.     for a := 0 to h do
  505.       for b := 1 to (h - a) do
  506.         if (TEA[(b - 1)] < TEA[b]) then
  507.           Swap(TEA[(b - 1)], TEA[b]);
  508.   end;
  509. end;
  510.  
  511. procedure TCABubbleSort(var TCA: array of Char; order: TSortOrder);
  512. var
  513.   t: Char;
  514.   a, b, h: Integer;
  515. begin
  516.   h := High(TCA);
  517.   if (h > 0) then
  518.   case order of
  519.     so_LowToHigh:
  520.     for a := 0 to h do
  521.       for b := 1 to (h - a) do
  522.         if (TCA[(b - 1)] > TCA[b]) then
  523.         begin
  524.           t := TCA[(b - 1)];
  525.           TCA[(b - 1)] := TCA[b];
  526.           TCA[b] := t;
  527.         end;
  528.     so_HighToLow:
  529.     for a := 0 to h do
  530.       for b := 1 to (h - a) do
  531.         if (TCA[(b - 1)] < TCA[b]) then
  532.         begin
  533.           t := TCA[(b - 1)];
  534.           TCA[(b - 1)] := TCA[b];
  535.           TCA[b] := t;
  536.         end;
  537.   end;
  538. end;
  539.  
  540. procedure TIAInsertionSort(var TIA: TIntegerArray; order: TSortOrder);
  541. var
  542.   a, b, h: Integer;
  543. begin
  544.   h := High(TIA);
  545.   if (h > 0) then
  546.   case order of
  547.     so_LowToHigh:
  548.     for a := 1 to h do
  549.       for b := a downto 1 do
  550.       begin
  551.         if not (TIA[b] < TIA[(b - 1)]) then
  552.           Break;
  553.         Swap(TIA[(b - 1)], TIA[b]);
  554.       end;
  555.     so_HighToLow:
  556.     for a := 1 to h do
  557.       for b := a downto 1 do
  558.       begin
  559.         if not (TIA[b] > TIA[(b - 1)]) then
  560.           Break;
  561.         Swap(TIA[(b - 1)], TIA[b]);
  562.       end;
  563.   end;
  564. end;
  565.  
  566. procedure TSAInsertionSort(var TSA: TStringArray; order: TSortOrder);
  567. var
  568.   a, b, h: Integer;
  569. begin
  570.   h := High(TSA);
  571.   if (h > 0) then
  572.   case order of
  573.     so_LowToHigh:
  574.     for a := 1 to h do
  575.       for b := a downto 1 do
  576.       begin
  577.         if not (TSA[b] < TSA[(b - 1)]) then
  578.           Break;
  579.         Swap(TSA[(b - 1)], TSA[b]);
  580.       end;
  581.     so_HighToLow:
  582.     for a := 1 to h do
  583.       for b := a downto 1 do
  584.       begin
  585.         if not (TSA[b] > TSA[(b - 1)]) then
  586.           Break;
  587.         Swap(TSA[(b - 1)], TSA[b]);
  588.       end;
  589.   end;
  590. end;
  591.  
  592. procedure TEAInsertionSort(var TEA: TExtendedArray; order: TSortOrder);
  593. var
  594.   a, b, h: Integer;
  595. begin
  596.   h := High(TEA);
  597.   if (h > 0) then
  598.   case order of
  599.     so_LowToHigh:
  600.     for a := 1 to h do
  601.       for b := a downto 1 do
  602.       begin
  603.         if not (TEA[b] < TEA[(b - 1)]) then
  604.           Break;
  605.         Swap(TEA[(b - 1)], TEA[b]);
  606.       end;
  607.     so_HighToLow:
  608.     for a := 1 to h do
  609.       for b := a downto 1 do
  610.       begin
  611.         if not (TEA[b] > TEA[(b - 1)]) then
  612.           Break;
  613.         Swap(TEA[(b - 1)], TEA[b]);
  614.       end;
  615.   end;
  616. end;
  617.  
  618. procedure TCAInsertionSort(var TCA: array of Char; order: TSortOrder);
  619. var
  620.   t: Char;
  621.   a, b, h: Integer;
  622. begin
  623.   h := High(TCA);
  624.   if (h > 0) then
  625.   case order of
  626.     so_LowToHigh:
  627.     for a := 1 to h do
  628.       for b := a downto 1 do
  629.       begin
  630.         if not (TCA[b] < TCA[(b - 1)]) then
  631.           Break;
  632.         t := TCA[(b - 1)];
  633.         TCA[(b - 1)] := TCA[b];
  634.         TCA[b] := t;
  635.       end;
  636.     so_HighToLow:
  637.     for a := 1 to h do
  638.       for b := a downto 1 do
  639.       begin
  640.         if not (TCA[b] > TCA[(b - 1)]) then
  641.           Break;
  642.         t := TCA[(b - 1)];
  643.         TCA[(b - 1)] := TCA[b];
  644.         TCA[b] := t;
  645.       end;
  646.   end;
  647. end;
  648.  
  649. procedure TIAShellSort(var TIA: TIntegerArray; order: TSortOrder);
  650. var
  651.   x, a, b, l: Integer;
  652. begin
  653.   l := Length(TIA);
  654.   if (l > 1) then
  655.   begin
  656.     x := 0;
  657.     while (x < (l div 3)) do
  658.       x := ((x * 3) + 1);
  659.     case order of
  660.       so_HighToLow:
  661.       while (x >= 1) do
  662.       begin
  663.         for a := x to (l - 1) do
  664.         begin
  665.           b := a;
  666.           while ((b >= x) and (TIA[b] > TIA[(b - x)])) do
  667.           begin
  668.             Swap(TIA[b], TIA[(b - x)]);
  669.             DecEx(b, x);
  670.           end;
  671.         end;
  672.         x := (x div 3);
  673.       end;
  674.       so_LowToHigh:
  675.       while (x >= 1) do
  676.       begin
  677.         for a := x to (l - 1) do
  678.         begin
  679.           b := a;
  680.           while ((b >= x) and (TIA[b] < TIA[(b - x)])) do
  681.           begin
  682.             Swap(TIA[b], TIA[(b - x)]);
  683.             DecEx(b, x);
  684.           end;
  685.         end;
  686.         x := (x div 3);
  687.       end;
  688.     end;
  689.   end;
  690. end;
  691.  
  692. procedure TSAShellSort(var TSA: TStringArray; order: TSortOrder);
  693. var
  694.   x, a, b, l: Integer;
  695. begin
  696.   l := Length(TSA);
  697.   if (l > 1) then
  698.   begin
  699.     x := 0;
  700.     while (x < (l div 3)) do
  701.       x := ((x * 3) + 1);
  702.     case order of
  703.       so_HighToLow:
  704.       while (x >= 1) do
  705.       begin
  706.         for a := x to (l - 1) do
  707.         begin
  708.           b := a;
  709.           while ((b >= x) and (TSA[b] > TSA[(b - x)])) do
  710.           begin
  711.             Swap(TSA[b], TSA[(b - x)]);
  712.             DecEx(b, x);
  713.           end;
  714.         end;
  715.         x := (x div 3);
  716.       end;
  717.       so_LowToHigh:
  718.       while (x >= 1) do
  719.       begin
  720.         for a := x to (l - 1) do
  721.         begin
  722.           b := a;
  723.           while ((b >= x) and (TSA[b] < TSA[(b - x)])) do
  724.           begin
  725.             Swap(TSA[b], TSA[(b - x)]);
  726.             DecEx(b, x);
  727.           end;
  728.         end;
  729.         x := (x div 3);
  730.       end;
  731.     end;
  732.   end;
  733. end;
  734.  
  735. procedure TEAShellSort(var TEA: TExtendedArray; order: TSortOrder);
  736. var
  737.   x, a, b, l: Integer;
  738. begin
  739.   l := Length(TEA);
  740.   if (l > 1) then
  741.   begin
  742.     x := 0;
  743.     while (x < (l div 3)) do
  744.       x := ((x * 3) + 1);
  745.     case order of
  746.       so_HighToLow:
  747.       while (x >= 1) do
  748.       begin
  749.         for a := x to (l - 1) do
  750.         begin
  751.           b := a;
  752.           while ((b >= x) and (TEA[b] > TEA[(b - x)])) do
  753.           begin
  754.             Swap(TEA[b], TEA[(b - x)]);
  755.             DecEx(b, x);
  756.           end;
  757.         end;
  758.         x := (x div 3);
  759.       end;
  760.       so_LowToHigh:
  761.       while (x >= 1) do
  762.       begin
  763.         for a := x to (l - 1) do
  764.         begin
  765.           b := a;
  766.           while ((b >= x) and (TEA[b] < TEA[(b - x)])) do
  767.           begin
  768.             Swap(TEA[b], TEA[(b - x)]);
  769.             DecEx(b, x);
  770.           end;
  771.         end;
  772.         x := (x div 3);
  773.       end;
  774.     end;
  775.   end;
  776. end;
  777.  
  778. procedure TCAShellSort(var TCA: array of Char; order: TSortOrder);
  779. var
  780.   t: Char;
  781.   x, a, b, l: Integer;
  782. begin
  783.   l := Length(TCA);
  784.   if (l > 1) then
  785.   begin
  786.     x := 0;
  787.     while (x < (l div 3)) do
  788.       x := ((x * 3) + 1);
  789.     case order of
  790.       so_HighToLow:
  791.       while (x >= 1) do
  792.       begin
  793.         for a := x to (l - 1) do
  794.         begin
  795.           b := a;
  796.           while ((b >= x) and (TCA[b] > TCA[(b - x)])) do
  797.           begin
  798.             t := TCA[(b - x)];
  799.             TCA[(b - x)] := TCA[b];
  800.             TCA[b] := t;
  801.             DecEx(b, x);
  802.           end;
  803.         end;
  804.         x := (x div 3);
  805.       end;
  806.       so_LowToHigh:
  807.       while (x >= 1) do
  808.       begin
  809.         for a := x to (l - 1) do
  810.         begin
  811.           b := a;
  812.           while ((b >= x) and (TCA[b] < TCA[(b - x)])) do
  813.           begin
  814.             t := TCA[(b - x)];
  815.             TCA[(b - x)] := TCA[b];
  816.             TCA[b] := t;
  817.             DecEx(b, x);
  818.           end;
  819.         end;
  820.         x := (x div 3);
  821.       end;
  822.     end;
  823.   end;
  824. end;
  825.  
  826. procedure TIASelectionSort(var TIA: TIntegerArray; order: TSortOrder);
  827. var
  828.   c, t, h, m: Integer;
  829. begin
  830.   h := High(TIA);
  831.   if (h > 0) then
  832.   case order of
  833.     so_LowToHigh:
  834.     for c := 0 to h do
  835.     begin
  836.       m := c;
  837.       for t := (c + 1) to h do
  838.         if (TIA[m] > TIA[t]) then
  839.           m := t;
  840.       Swap(TIA[m], TIA[c]);
  841.     end;
  842.     so_HighToLow:
  843.     for c := 0 to h do
  844.     begin
  845.       m := c;
  846.       for t := (c + 1) to h do
  847.         if (TIA[m] < TIA[t]) then
  848.           m := t;
  849.       Swap(TIA[m], TIA[c]);
  850.     end;
  851.   end;
  852. end;
  853.  
  854. procedure TSASelectionSort(var TSA: TStringArray; order: TSortOrder);
  855. var
  856.   c, t, h, m: Integer;
  857. begin
  858.   h := High(TSA);
  859.   if (h > 0) then
  860.   case order of
  861.     so_LowToHigh:
  862.     for c := 0 to h do
  863.     begin
  864.       m := c;
  865.       for t := (c + 1) to h do
  866.         if (TSA[m] > TSA[t]) then
  867.           m := t;
  868.       Swap(TSA[m], TSA[c]);
  869.     end;
  870.     so_HighToLow:
  871.     for c := 0 to h do
  872.     begin
  873.       m := c;
  874.       for t := (c + 1) to h do
  875.         if (TSA[m] < TSA[t]) then
  876.           m := t;
  877.       Swap(TSA[m], TSA[c]);
  878.     end;
  879.   end;
  880. end;
  881.  
  882. procedure TEASelectionSort(var TEA: TExtendedArray; order: TSortOrder);
  883. var
  884.   c, t, h, m: Integer;
  885. begin
  886.   h := High(TEA);
  887.   if (h > 0) then
  888.   case order of
  889.     so_LowToHigh:
  890.     for c := 0 to h do
  891.     begin
  892.       m := c;
  893.       for t := (c + 1) to h do
  894.         if (TEA[m] > TEA[t]) then
  895.           m := t;
  896.       Swap(TEA[m], TEA[c]);
  897.     end;
  898.     so_HighToLow:
  899.     for c := 0 to h do
  900.     begin
  901.       m := c;
  902.       for t := (c + 1) to h do
  903.         if (TEA[m] < TEA[t]) then
  904.           m := t;
  905.       Swap(TEA[m], TEA[c]);
  906.     end;
  907.   end;
  908. end;
  909.  
  910. procedure TCASelectionSort(var TCA: array of Char; order: TSortOrder);
  911. var
  912.   c, t, h, m: Integer;
  913.   z: Char;
  914. begin
  915.   h := High(TCA);
  916.   if (h > 0) then
  917.   case order of
  918.     so_LowToHigh:
  919.     for c := 0 to h do
  920.     begin
  921.       m := c;
  922.       for t := (c + 1) to h do
  923.         if (TCA[m] > TCA[t]) then
  924.           m := t;
  925.       z := TCA[m];
  926.       TCA[m] := TCA[c];
  927.       TCA[c] := z;
  928.     end;
  929.     so_HighToLow:
  930.     for c := 0 to h do
  931.     begin
  932.       m := c;
  933.       for t := (c + 1) to h do
  934.         if (TCA[m] < TCA[t]) then
  935.           m := t;
  936.       z := TCA[m];
  937.       TCA[m] := TCA[c];
  938.       TCA[c] := z;
  939.     end;
  940.   end;
  941. end;
  942.  
  943. procedure TIAHeapSort(var TIA: TIntegerArray; order: TSortOrder);
  944. var
  945.   a, b, r, c, l: Integer;
  946. begin
  947.   l := Length(TIA);
  948.   if (l > 1) then
  949.   begin
  950.     a := ((l - 1) div 2);
  951.     b := (l - 1);
  952.     case order of
  953.       so_LowToHigh:
  954.       begin
  955.         while (a >= 0) do
  956.         begin
  957.           r := a;
  958.           while (((r * 2) + 1) <= (l - 1)) do
  959.           begin
  960.             c := ((r * 2) + 1);
  961.             if ((c < (l - 1)) and (TIA[c] < TIA[(c + 1)])) then
  962.               c := (c + 1);
  963.             if (TIA[r] < TIA[c]) then
  964.             begin
  965.               Swap(TIA[r], TIA[c]);
  966.               r := c;
  967.             end else
  968.               Break;
  969.           end;
  970.           a := (a - 1);
  971.         end;
  972.         while (b > 0) do
  973.         begin
  974.           Swap(TIA[b], TIA[0]);
  975.           b := (b - 1);
  976.           r := 0;
  977.           while (((r * 2) + 1) <= b) do
  978.           begin
  979.             c := ((r * 2) + 1);
  980.             if ((c < b) and (TIA[c] < TIA[(c + 1)])) then
  981.               c := (c + 1);
  982.             if (TIA[r] < TIA[c]) then
  983.             begin
  984.               Swap(TIA[r], TIA[c]);
  985.               r := c;
  986.             end else
  987.               Break;
  988.           end;
  989.         end;
  990.       end;
  991.       so_HighToLow:
  992.       begin
  993.         while (a >= 0) do
  994.         begin
  995.           r := a;
  996.           while (((r * 2) + 1) <= (l - 1)) do
  997.           begin
  998.             c := ((r * 2) + 1);
  999.             if ((c < (l - 1)) and (TIA[c] > TIA[(c + 1)])) then
  1000.               c := (c + 1);
  1001.             if (TIA[r] > TIA[c]) then
  1002.             begin
  1003.               Swap(TIA[r], TIA[c]);
  1004.               r := c;
  1005.             end else
  1006.               Break;
  1007.           end;
  1008.           a := (a - 1);
  1009.         end;
  1010.         while (b > 0) do
  1011.         begin
  1012.           Swap(TIA[b], TIA[0]);
  1013.           b := (b - 1);
  1014.           r := 0;
  1015.           while (((r * 2) + 1) <= b) do
  1016.           begin
  1017.             c := ((r * 2) + 1);
  1018.             if ((c < b) and (TIA[c] > TIA[(c + 1)])) then
  1019.               c := (c + 1);
  1020.             if (TIA[r] > TIA[c]) then
  1021.             begin
  1022.               Swap(TIA[r], TIA[c]);
  1023.               r := c;
  1024.             end else
  1025.               Break;
  1026.           end;
  1027.         end;
  1028.       end;
  1029.     end;
  1030.   end;
  1031. end;
  1032.  
  1033. procedure TSAHeapSort(var TSA: TStringArray; order: TSortOrder);
  1034. var
  1035.   a, b, r, c, l: Integer;
  1036. begin
  1037.   l := Length(TSA);
  1038.   if (l > 1) then
  1039.   begin
  1040.     a := ((l - 1) div 2);
  1041.     b := (l - 1);
  1042.     case order of
  1043.       so_LowToHigh:
  1044.       begin
  1045.         while (a >= 0) do
  1046.         begin
  1047.           r := a;
  1048.           while (((r * 2) + 1) <= (l - 1)) do
  1049.           begin
  1050.             c := ((r * 2) + 1);
  1051.             if ((c < (l - 1)) and (TSA[c] < TSA[(c + 1)])) then
  1052.               c := (c + 1);
  1053.             if (TSA[r] < TSA[c]) then
  1054.             begin
  1055.               Swap(TSA[r], TSA[c]);
  1056.               r := c;
  1057.             end else
  1058.               Break;
  1059.           end;
  1060.           a := (a - 1);
  1061.         end;
  1062.         while (b > 0) do
  1063.         begin
  1064.           Swap(TSA[b], TSA[0]);
  1065.           b := (b - 1);
  1066.           r := 0;
  1067.           while (((r * 2) + 1) <= b) do
  1068.           begin
  1069.             c := ((r * 2) + 1);
  1070.             if ((c < b) and (TSA[c] < TSA[(c + 1)])) then
  1071.               c := (c + 1);
  1072.             if (TSA[r] < TSA[c]) then
  1073.             begin
  1074.               Swap(TSA[r], TSA[c]);
  1075.               r := c;
  1076.             end else
  1077.               Break;
  1078.           end;
  1079.         end;
  1080.       end;
  1081.       so_HighToLow:
  1082.       begin
  1083.         while (a >= 0) do
  1084.         begin
  1085.           r := a;
  1086.           while (((r * 2) + 1) <= (l - 1)) do
  1087.           begin
  1088.             c := ((r * 2) + 1);
  1089.             if ((c < (l - 1)) and (TSA[c] > TSA[(c + 1)])) then
  1090.               c := (c + 1);
  1091.             if (TSA[r] > TSA[c]) then
  1092.             begin
  1093.               Swap(TSA[r], TSA[c]);
  1094.               r := c;
  1095.             end else
  1096.               Break;
  1097.           end;
  1098.           a := (a - 1);
  1099.         end;
  1100.         while (b > 0) do
  1101.         begin
  1102.           Swap(TSA[b], TSA[0]);
  1103.           b := (b - 1);
  1104.           r := 0;
  1105.           while (((r * 2) + 1) <= b) do
  1106.           begin
  1107.             c := ((r * 2) + 1);
  1108.             if ((c < b) and (TSA[c] > TSA[(c + 1)])) then
  1109.               c := (c + 1);
  1110.             if (TSA[r] > TSA[c]) then
  1111.             begin
  1112.               Swap(TSA[r], TSA[c]);
  1113.               r := c;
  1114.             end else
  1115.               Break;
  1116.           end;
  1117.         end;
  1118.       end;
  1119.     end;
  1120.   end;
  1121. end;
  1122.  
  1123. procedure TEAHeapSort(var TEA: TExtendedArray; order: TSortOrder);
  1124. var
  1125.   a, b, r, c, l: Integer;
  1126. begin
  1127.   l := Length(TEA);
  1128.   if (l > 1) then
  1129.   begin
  1130.     a := ((l - 1) div 2);
  1131.     b := (l - 1);
  1132.     case order of
  1133.       so_LowToHigh:
  1134.       begin
  1135.         while (a >= 0) do
  1136.         begin
  1137.           r := a;
  1138.           while (((r * 2) + 1) <= (l - 1)) do
  1139.           begin
  1140.             c := ((r * 2) + 1);
  1141.             if ((c < (l - 1)) and (TEA[c] < TEA[(c + 1)])) then
  1142.               c := (c + 1);
  1143.             if (TEA[r] < TEA[c]) then
  1144.             begin
  1145.               Swap(TEA[r], TEA[c]);
  1146.               r := c;
  1147.             end else
  1148.               Break;
  1149.           end;
  1150.           a := (a - 1);
  1151.         end;
  1152.         while (b > 0) do
  1153.         begin
  1154.           Swap(TEA[b], TEA[0]);
  1155.           b := (b - 1);
  1156.           r := 0;
  1157.           while (((r * 2) + 1) <= b) do
  1158.           begin
  1159.             c := ((r * 2) + 1);
  1160.             if ((c < b) and (TEA[c] < TEA[(c + 1)])) then
  1161.               c := (c + 1);
  1162.             if (TEA[r] < TEA[c]) then
  1163.             begin
  1164.               Swap(TEA[r], TEA[c]);
  1165.               r := c;
  1166.             end else
  1167.               Break;
  1168.           end;
  1169.         end;
  1170.       end;
  1171.       so_HighToLow:
  1172.       begin
  1173.         while (a >= 0) do
  1174.         begin
  1175.           r := a;
  1176.           while (((r * 2) + 1) <= (l - 1)) do
  1177.           begin
  1178.             c := ((r * 2) + 1);
  1179.             if ((c < (l - 1)) and (TEA[c] > TEA[(c + 1)])) then
  1180.               c := (c + 1);
  1181.             if (TEA[r] > TEA[c]) then
  1182.             begin
  1183.               Swap(TEA[r], TEA[c]);
  1184.               r := c;
  1185.             end else
  1186.               Break;
  1187.           end;
  1188.           a := (a - 1);
  1189.         end;
  1190.         while (b > 0) do
  1191.         begin
  1192.           Swap(TEA[b], TEA[0]);
  1193.           b := (b - 1);
  1194.           r := 0;
  1195.           while (((r * 2) + 1) <= b) do
  1196.           begin
  1197.             c := ((r * 2) + 1);
  1198.             if ((c < b) and (TEA[c] > TEA[(c + 1)])) then
  1199.               c := (c + 1);
  1200.             if (TEA[r] > TEA[c]) then
  1201.             begin
  1202.               Swap(TEA[r], TEA[c]);
  1203.               r := c;
  1204.             end else
  1205.               Break;
  1206.           end;
  1207.         end;
  1208.       end;
  1209.     end;
  1210.   end;
  1211. end;
  1212.  
  1213. procedure TCAHeapSort(var TCA: array of Char; order: TSortOrder);
  1214. var
  1215.   a, b, r, c, l: Integer;
  1216.   t: Char;
  1217. begin
  1218.   l := Length(TCA);
  1219.   if (l > 1) then
  1220.   begin
  1221.     a := ((l - 1) div 2);
  1222.     b := (l - 1);
  1223.     case order of
  1224.       so_LowToHigh:
  1225.       begin
  1226.         while (a >= 0) do
  1227.         begin
  1228.           r := a;
  1229.           while (((r * 2) + 1) <= (l - 1)) do
  1230.           begin
  1231.             c := ((r * 2) + 1);
  1232.             if ((c < (l - 1)) and (TCA[c] < TCA[(c + 1)])) then
  1233.               c := (c + 1);
  1234.             if (TCA[r] < TCA[c]) then
  1235.             begin
  1236.               t := TCA[r];
  1237.               TCA[r] := TCA[c];
  1238.               TCA[c] := t;
  1239.               r := c;
  1240.             end else
  1241.               Break;
  1242.           end;
  1243.           a := (a - 1);
  1244.         end;
  1245.         while (b > 0) do
  1246.         begin
  1247.           t := TCA[b];
  1248.           TCA[b] := TCA[0];
  1249.           TCA[0] := t;
  1250.           b := (b - 1);
  1251.           r := 0;
  1252.           while (((r * 2) + 1) <= b) do
  1253.           begin
  1254.             c := ((r * 2) + 1);
  1255.             if ((c < b) and (TCA[c] < TCA[(c + 1)])) then
  1256.               c := (c + 1);
  1257.             if (TCA[r] < TCA[c]) then
  1258.             begin
  1259.               t := TCA[r];
  1260.               TCA[r] := TCA[c];
  1261.               TCA[c] := t;
  1262.               r := c;
  1263.             end else
  1264.               Break;
  1265.           end;
  1266.         end;
  1267.       end;
  1268.       so_HighToLow:
  1269.       begin
  1270.         while (a >= 0) do
  1271.         begin
  1272.           r := a;
  1273.           while (((r * 2) + 1) <= (l - 1)) do
  1274.           begin
  1275.             c := ((r * 2) + 1);
  1276.             if ((c < (l - 1)) and (TCA[c] > TCA[(c + 1)])) then
  1277.               c := (c + 1);
  1278.             if (TCA[r] > TCA[c]) then
  1279.             begin
  1280.               t := TCA[r];
  1281.               TCA[r] := TCA[c];
  1282.               TCA[c] := t;
  1283.               r := c;
  1284.             end else
  1285.               Break;
  1286.           end;
  1287.           a := (a - 1);
  1288.         end;
  1289.         while (b > 0) do
  1290.         begin
  1291.           t := TCA[b];
  1292.           TCA[b] := TCA[0];
  1293.           TCA[0] := t;
  1294.           b := (b - 1);
  1295.           r := 0;
  1296.           while (((r * 2) + 1) <= b) do
  1297.           begin
  1298.             c := ((r * 2) + 1);
  1299.             if ((c < b) and (TCA[c] > TCA[(c + 1)])) then
  1300.               c := (c + 1);
  1301.             if (TCA[r] > TCA[c]) then
  1302.             begin
  1303.               t := TCA[r];
  1304.               TCA[r] := TCA[c];
  1305.               TCA[c] := t;
  1306.               r := c;
  1307.             end else
  1308.               Break;
  1309.           end;
  1310.         end;
  1311.       end;
  1312.     end;
  1313.   end;
  1314. end;
  1315.  
  1316. procedure __TIA_LH_QS(TIA: TIntegerArray; Lo, Hi: Integer);
  1317. var
  1318.   L, R, v, m: Integer;
  1319. begin
  1320.   if (Lo >= Hi) then
  1321.     Exit;
  1322.   v := TIA[Lo];
  1323.   L := Lo;
  1324.   R := (Hi + 1);
  1325.   while True do
  1326.   begin
  1327.     repeat
  1328.       Inc(L);
  1329.       if ((v < TIA[L]) or (L = Hi)) then
  1330.         Break;
  1331.     until False;
  1332.     repeat
  1333.       Dec(R);
  1334.       if ((v > TIA[R]) or (R = Lo)) then
  1335.         Break;
  1336.     until False;
  1337.     if (L >= R) then
  1338.       Break;
  1339.     Swap(TIA[L], TIA[R]);
  1340.   end;
  1341.   Swap(TIA[R], TIA[Lo]);
  1342.   m := R;
  1343.   __TIA_LH_QS(TIA, Lo, (m - 1));
  1344.   __TIA_LH_QS(TIA, (m + 1), Hi);
  1345. end;
  1346.  
  1347. procedure __TIA_HL_QS(TIA: TIntegerArray; Lo, Hi: Integer);
  1348. var
  1349.   L, R, v, m: Integer;
  1350. begin
  1351.   if (Lo >= Hi) then
  1352.     Exit;
  1353.   v := TIA[Lo];
  1354.   L := Lo;
  1355.   R := (Hi + 1);
  1356.   while True do
  1357.   begin
  1358.     repeat
  1359.       Inc(L);
  1360.       if ((v > TIA[L]) or (L = Hi)) then
  1361.         Break;
  1362.     until False;
  1363.     repeat
  1364.       Dec(R);
  1365.       if ((v < TIA[R]) or (R = Lo)) then
  1366.         Break;
  1367.     until False;
  1368.     if (L >= R) then
  1369.       Break;
  1370.     Swap(TIA[L], TIA[R]);
  1371.   end;
  1372.   Swap(TIA[R], TIA[Lo]);
  1373.   m := R;
  1374.   __TIA_HL_QS(TIA, Lo, (m - 1));
  1375.   __TIA_HL_QS(TIA, (m + 1), Hi);
  1376. end;
  1377.  
  1378. procedure __TEA_LH_QS(TEA: TExtendedArray; Lo, Hi: Integer);
  1379. var
  1380.   L, R, m: Integer;
  1381.   v: Extended;
  1382. begin
  1383.   if (Lo >= Hi) then
  1384.     Exit;
  1385.   v := TEA[Lo];
  1386.   L := Lo;
  1387.   R := (Hi + 1);
  1388.   while True do
  1389.   begin
  1390.     repeat
  1391.       Inc(L);
  1392.       if ((v < TEA[L]) or (L = Hi)) then
  1393.         Break;
  1394.     until False;
  1395.     repeat
  1396.       Dec(R);
  1397.       if ((v > TEA[R]) or (R = Lo)) then
  1398.         Break;
  1399.     until False;
  1400.     if (L >= R) then
  1401.       Break;
  1402.     Swap(TEA[L], TEA[R]);
  1403.   end;
  1404.   Swap(TEA[R], TEA[Lo]);
  1405.   m := R;
  1406.   __TEA_LH_QS(TEA, Lo, (m - 1));
  1407.   __TEA_LH_QS(TEA, (m + 1), Hi);
  1408. end;
  1409.  
  1410. procedure __TEA_HL_QS(TEA: TExtendedArray; Lo, Hi: Integer);
  1411. var
  1412.   L, R, m: Integer;
  1413.   v: Extended;
  1414. begin
  1415.   if (Lo >= Hi) then
  1416.     Exit;
  1417.   v := TEA[Lo];
  1418.   L := Lo;
  1419.   R := (Hi + 1);
  1420.   while True do
  1421.   begin
  1422.     repeat
  1423.       Inc(L);
  1424.       if ((v > TEA[L]) or (L = Hi)) then
  1425.         Break;
  1426.     until False;
  1427.     repeat
  1428.       Dec(R);
  1429.       if ((v < TEA[R]) or (R = Lo)) then
  1430.         Break;
  1431.     until False;
  1432.     if (L >= R) then
  1433.       Break;
  1434.     Swap(TEA[L], TEA[R]);
  1435.   end;
  1436.   Swap(TEA[R], TEA[Lo]);
  1437.   m := R;
  1438.   __TEA_HL_QS(TEA, Lo, (m - 1));
  1439.   __TEA_HL_QS(TEA, (m + 1), Hi);
  1440. end;
  1441.  
  1442. procedure __TSA_LH_QS(TSA: TStringArray; Lo, Hi: Integer);
  1443. var
  1444.   L, R, m: Integer;
  1445.   v: string;
  1446. begin
  1447.   if (Lo >= Hi) then
  1448.     Exit;
  1449.   v := TSA[Lo];
  1450.   L := Lo;
  1451.   R := (Hi + 1);
  1452.   while True do
  1453.   begin
  1454.     repeat
  1455.       Inc(L);
  1456.       if ((v < TSA[L]) or (L = Hi)) then
  1457.         Break;
  1458.     until False;
  1459.     repeat
  1460.       Dec(R);
  1461.       if ((v > TSA[R]) or (R = Lo)) then
  1462.         Break;
  1463.     until False;
  1464.     if (L >= R) then
  1465.       Break;
  1466.     Swap(TSA[L], TSA[R]);
  1467.   end;
  1468.   Swap(TSA[R], TSA[Lo]);
  1469.   m := R;
  1470.   __TSA_LH_QS(TSA, Lo, (m - 1));
  1471.   __TSA_LH_QS(TSA, (m + 1), Hi);
  1472. end;
  1473.  
  1474. procedure __TSA_HL_QS(TSA: TStringArray; Lo, Hi: Integer);
  1475. var
  1476.   L, R, m: Integer;
  1477.   v: string;
  1478. begin
  1479.   if (Lo >= Hi) then
  1480.     Exit;
  1481.   v := TSA[Lo];
  1482.   L := Lo;
  1483.   R := (Hi + 1);
  1484.   while True do
  1485.   begin
  1486.     repeat
  1487.       Inc(L);
  1488.       if ((v > TSA[L]) or (L = Hi)) then
  1489.         Break;
  1490.     until False;
  1491.     repeat
  1492.       Dec(R);
  1493.       if ((v < TSA[R]) or (R = Lo)) then
  1494.         Break;
  1495.     until False;
  1496.     if (L >= R) then
  1497.       Break;
  1498.     Swap(TSA[L], TSA[R]);
  1499.   end;
  1500.   Swap(TSA[R], TSA[Lo]);
  1501.   m := R;
  1502.   __TSA_HL_QS(TSA, Lo, (m - 1));
  1503.   __TSA_HL_QS(TSA, (m + 1), Hi);
  1504. end;
  1505.  
  1506. procedure __TCA_LH_QS(TCA: array of Char; Lo, Hi: Integer);
  1507. var
  1508.   L, R, m: Integer;
  1509.   v, t: char;
  1510. begin
  1511.   if (Lo >= Hi) then
  1512.     Exit;
  1513.   v := TCA[Lo];
  1514.   L := Lo;
  1515.   R := (Hi + 1);
  1516.   while True do
  1517.   begin
  1518.     repeat
  1519.       Inc(L);
  1520.       if ((v < TCA[L]) or (L = Hi)) then
  1521.         Break;
  1522.     until False;
  1523.     repeat
  1524.       Dec(R);
  1525.       if ((v > TCA[R]) or (R = Lo)) then
  1526.         Break;
  1527.     until False;
  1528.     if (L >= R) then
  1529.       Break;
  1530.     t := TCA[L];
  1531.     TCA[L] := TCA[R];
  1532.     TCA[R] := t;
  1533.   end;
  1534.   t := TCA[R];
  1535.   TCA[R] := TCA[Lo];
  1536.   TCA[Lo] := t;
  1537.   m := R;
  1538.   __TCA_LH_QS(TCA, Lo, (m - 1));
  1539.   __TCA_LH_QS(TCA, (m + 1), Hi);
  1540. end;
  1541.  
  1542. procedure __TCA_HL_QS(TCA: array of Char; Lo, Hi: Integer);
  1543. var
  1544.   L, R, m: Integer;
  1545.   v, t: Char;
  1546. begin
  1547.   if (Lo >= Hi) then
  1548.     Exit;
  1549.   v := TCA[Lo];
  1550.   L := Lo;
  1551.   R := (Hi + 1);
  1552.   while True do
  1553.   begin
  1554.     repeat
  1555.       Inc(L);
  1556.       if ((v > TCA[L]) or (L = Hi)) then
  1557.         Break;
  1558.     until False;
  1559.     repeat
  1560.       Dec(R);
  1561.       if ((v < TCA[R]) or (R = Lo)) then
  1562.         Break;
  1563.     until False;
  1564.     if (L >= R) then
  1565.       Break;
  1566.     t := TCA[L];
  1567.     TCA[L] := TCA[R];
  1568.     TCA[R] := t;
  1569.   end;
  1570.   t := TCA[R];
  1571.   TCA[R] := TCA[Lo];
  1572.   TCA[Lo] := t;
  1573.   m := R;
  1574.   __TCA_HL_QS(TCA, Lo, (m - 1));
  1575.   __TCA_HL_QS(TCA, (m + 1), Hi);
  1576. end;
  1577.  
  1578. procedure TIAQuickSort(TIA: TIntegerArray; order: TSortOrder);
  1579. var
  1580.   h: Integer;
  1581. begin
  1582.   h := High(TIA);
  1583.   if (h > 0) then
  1584.   case order of
  1585.     so_LowToHigh: __TIA_LH_QS(TIA, 0, h);
  1586.     so_HighToLow: __TIA_HL_QS(TIA, 0, h);
  1587.   end;
  1588. end;
  1589.  
  1590. procedure TSAQuickSort(TSA: TStringArray; order: TSortOrder);
  1591. var
  1592.   h: Integer;
  1593. begin
  1594.   h := High(TSA);
  1595.   if (h > 0) then
  1596.   case order of
  1597.     so_LowToHigh: __TSA_LH_QS(TSA, 0, h);
  1598.     so_HighToLow: __TSA_HL_QS(TSA, 0, h);
  1599.   end;
  1600. end;
  1601.  
  1602. procedure TEAQuickSort(TEA: TExtendedArray; order: TSortOrder);
  1603. var
  1604.   h: Integer;
  1605. begin
  1606.   h := High(TEA);
  1607.   if (h > 0) then
  1608.   case order of
  1609.     so_LowToHigh: __TEA_LH_QS(TEA, 0, h);
  1610.     so_HighToLow: __TEA_HL_QS(TEA, 0, h);
  1611.   end;
  1612. end;
  1613.  
  1614. procedure TCAQuickSort(TCA: array of Char; order: TSortOrder);
  1615. var
  1616.   h: Integer;
  1617. begin
  1618.   h := High(TCA);
  1619.   if (h > 0) then
  1620.   case order of
  1621.     so_LowToHigh: __TCA_LH_QS(TCA, 0, h);
  1622.     so_HighToLow: __TCA_HL_QS(TCA, 0, h);
  1623.   end;
  1624. end;
  1625.  
  1626. procedure __TSA_HL_QS3W(var TSA: TStringArray; const L, H: Integer);
  1627. var
  1628.   ls, rs, p: Integer;
  1629.   x: string;
  1630. begin
  1631.   if (L >= H) then
  1632.     Exit;
  1633.   x := TSA[L];
  1634.   ls := L;
  1635.   rs := H;
  1636.   p := (L + 1);
  1637.   while (p <= rs) do
  1638.     if (TSA[p] > x) then
  1639.     begin
  1640.       Swap(TSA[ls], TSA[p]);
  1641.       Inc(p);
  1642.       Inc(ls);
  1643.     end else
  1644.     if (TSA[p] < x) then
  1645.     begin
  1646.       Swap(TSA[rs], TSA[p]);
  1647.       Dec(rs);
  1648.     end else
  1649.       Inc(p);
  1650.   __TSA_HL_QS3W(TSA, L, (ls - 1));
  1651.   __TSA_HL_QS3W(TSA, (rs + 1), H);
  1652. end;
  1653.  
  1654. procedure __TSA_LH_QS3W(var TSA: TStringArray; const L, H: Integer);
  1655. var
  1656.   ls, rs, p: Integer;
  1657.   x: string;
  1658. begin
  1659.   if (L >= H) then
  1660.     Exit;
  1661.   x := TSA[L];
  1662.   ls := L;
  1663.   rs := H;
  1664.   p := (L + 1);
  1665.   while (p <= rs) do
  1666.     if (TSA[p] < x) then
  1667.     begin
  1668.       Swap(TSA[ls], TSA[p]);
  1669.       Inc(p);
  1670.       Inc(ls);
  1671.     end else
  1672.     if (TSA[p] > x) then
  1673.     begin
  1674.       Swap(TSA[rs], TSA[p]);
  1675.       Dec(rs);
  1676.     end else
  1677.       Inc(p);
  1678.   __TSA_LH_QS3W(TSA, L, (ls - 1));
  1679.   __TSA_LH_QS3W(TSA, (rs + 1), H);
  1680. end;
  1681.  
  1682. procedure __TEA_HL_QS3W(var TEA: TExtendedArray; const L, H: Integer);
  1683. var
  1684.   ls, rs, p: Integer;
  1685.   x: Extended;
  1686. begin
  1687.   if (L >= H) then
  1688.     Exit;
  1689.   x := TEA[L];
  1690.   ls := L;
  1691.   rs := H;
  1692.   p := (L + 1);
  1693.   while (p <= rs) do
  1694.     if (TEA[p] > x) then
  1695.     begin
  1696.       Swap(TEA[ls], TEA[p]);
  1697.       Inc(p);
  1698.       Inc(ls);
  1699.     end else
  1700.     if (TEA[p] < x) then
  1701.     begin
  1702.       Swap(TEA[rs], TEA[p]);
  1703.       Dec(rs);
  1704.     end else
  1705.       Inc(p);
  1706.   __TEA_HL_QS3W(TEA, L, (ls - 1));
  1707.   __TEA_HL_QS3W(TEA, (rs + 1), H);
  1708. end;
  1709.  
  1710. procedure __TEA_LH_QS3W(var TEA: TExtendedArray; const L, H: Integer);
  1711. var
  1712.   ls, rs, p: Integer;
  1713.   x: Extended;
  1714. begin
  1715.   if (L >= H) then
  1716.     Exit;
  1717.   x := TEA[L];
  1718.   ls := L;
  1719.   rs := H;
  1720.   p := (L + 1);
  1721.   while (p <= rs) do
  1722.     if (TEA[p] < x) then
  1723.     begin
  1724.       Swap(TEA[ls], TEA[p]);
  1725.       Inc(p);
  1726.       Inc(ls);
  1727.     end else
  1728.     if (TEA[p] > x) then
  1729.     begin
  1730.       Swap(TEA[rs], TEA[p]);
  1731.       Dec(rs);
  1732.     end else
  1733.       Inc(p);
  1734.   __TEA_LH_QS3W(TEA, L, (ls - 1));
  1735.   __TEA_LH_QS3W(TEA, (rs + 1), H);
  1736. end;
  1737.  
  1738. procedure __TCA_HL_QS3W(var TCA: array of Char; const L, H: Integer);
  1739. var
  1740.   t: Char;
  1741.   ls, rs, p: Integer;
  1742.   x: string;
  1743. begin
  1744.   if (L >= H) then
  1745.     Exit;
  1746.   x := TCA[L];
  1747.   ls := L;
  1748.   rs := H;
  1749.   p := (L + 1);
  1750.   while (p <= rs) do
  1751.     if (TCA[p] > x) then
  1752.     begin
  1753.       t := TCA[ls];
  1754.       TCA[ls] := TCA[p];
  1755.       TCA[p] := t;
  1756.       Inc(p);
  1757.       Inc(ls);
  1758.     end else
  1759.     if (TCA[p] < x) then
  1760.     begin
  1761.       t := TCA[rs];
  1762.       TCA[rs] := TCA[p];
  1763.       TCA[p] := t;
  1764.       Dec(rs);
  1765.     end else
  1766.       Inc(p);
  1767.   __TCA_HL_QS3W(TCA, L, (ls - 1));
  1768.   __TCA_HL_QS3W(TCA, (rs + 1), H);
  1769. end;
  1770.  
  1771. procedure __TCA_LH_QS3W(var TCA: array of Char; const L, H: Integer);
  1772. var
  1773.   t: Char;
  1774.   ls, rs, p: Integer;
  1775.   x: string;
  1776. begin
  1777.   if (L >= H) then
  1778.     Exit;
  1779.   x := TCA[L];
  1780.   ls := L;
  1781.   rs := H;
  1782.   p := (L + 1);
  1783.   while (p <= rs) do
  1784.     if (TCA[p] < x) then
  1785.     begin
  1786.       t := TCA[ls];
  1787.       TCA[ls] := TCA[p];
  1788.       TCA[p] := t;
  1789.       Inc(p);
  1790.       Inc(ls);
  1791.     end else
  1792.     if (TCA[p] > x) then
  1793.     begin
  1794.       t := TCA[rs];
  1795.       TCA[rs] := TCA[p];
  1796.       TCA[p] := t;
  1797.       Dec(rs);
  1798.     end else
  1799.       Inc(p);
  1800.   __TCA_LH_QS3W(TCA, L, (ls - 1));
  1801.   __TCA_LH_QS3W(TCA, (rs + 1), H);
  1802. end;
  1803.  
  1804. procedure __TIA_HL_QS3W(var TIA: TIntegerArray; const L, H: Integer);
  1805. var
  1806.   ls, rs, p, x: Integer;
  1807. begin
  1808.   if (L >= H) then
  1809.     Exit;
  1810.   x := TIA[L];
  1811.   ls := L;
  1812.   rs := H;
  1813.   p := (L + 1);
  1814.   while (p <= rs) do
  1815.     if (TIA[p] > x) then
  1816.     begin
  1817.       Swap(TIA[ls], TIA[p]);
  1818.       Inc(p);
  1819.       Inc(ls);
  1820.     end else
  1821.     if (TIA[p] < x) then
  1822.     begin
  1823.       Swap(TIA[rs], TIA[p]);
  1824.       Dec(rs);
  1825.     end else
  1826.       Inc(p);
  1827.   __TIA_HL_QS3W(TIA, L, (ls - 1));
  1828.   __TIA_HL_QS3W(TIA, (rs + 1), H);
  1829. end;
  1830.  
  1831. procedure __TIA_LH_QS3W(var TIA: TIntegerArray; const L, H: Integer);
  1832. var
  1833.   ls, rs, p, x: Integer;
  1834. begin
  1835.   if (L >= H) then
  1836.     Exit;
  1837.   x := TIA[L];
  1838.   ls := L;
  1839.   rs := H;
  1840.   p := (L + 1);
  1841.   while (p <= rs) do
  1842.     if (TIA[p] < x) then
  1843.     begin
  1844.       Swap(TIA[ls], TIA[p]);
  1845.       Inc(p);
  1846.       Inc(ls);
  1847.     end else
  1848.     if (TIA[p] > x) then
  1849.     begin
  1850.       Swap(TIA[rs], TIA[p]);
  1851.       Dec(rs);
  1852.     end else
  1853.       Inc(p);
  1854.   __TIA_LH_QS3W(TIA, L, (ls - 1));
  1855.   __TIA_LH_QS3W(TIA, (rs + 1), H);
  1856. end;
  1857.  
  1858. procedure TIAQuickSort3W(var TIA: TIntegerArray; order: TSortOrder);
  1859. var
  1860.   h: Integer;
  1861. begin
  1862.   h := High(TIA);
  1863.   if (h > 0) then
  1864.   case order of
  1865.     so_LowToHigh: __TIA_LH_QS3W(TIA, 0, h);
  1866.     so_HighToLow: __TIA_HL_QS3W(TIA, 0, h);
  1867.   end;
  1868. end;
  1869.  
  1870. procedure TSAQuickSort3W(var TSA: TStringArray; order: TSortOrder);
  1871. var
  1872.   h: Integer;
  1873. begin
  1874.   h := High(TSA);
  1875.   if (h > 0) then
  1876.   case order of
  1877.     so_LowToHigh: __TSA_LH_QS3W(TSA, 0, h);
  1878.     so_HighToLow: __TSA_HL_QS3W(TSA, 0, h);
  1879.   end;
  1880. end;
  1881.  
  1882. procedure TEAQuickSort3W(var TEA: TExtendedArray; order: TSortOrder);
  1883. var
  1884.   h: Integer;
  1885. begin
  1886.   h := High(TEA);
  1887.   if (h > 0) then
  1888.   case order of
  1889.     so_LowToHigh: __TEA_LH_QS3W(TEA, 0, h);
  1890.     so_HighToLow: __TEA_HL_QS3W(TEA, 0, h);
  1891.   end;
  1892. end;
  1893.  
  1894. procedure TCAQuickSort3W(var TCA: array of Char; order: TSortOrder);
  1895. var
  1896.   h: Integer;
  1897. begin
  1898.   h := High(TCA);
  1899.   if (h > 0) then
  1900.   case order of
  1901.     so_LowToHigh: __TCA_LH_QS3W(TCA, 0, h);
  1902.     so_HighToLow: __TCA_HL_QS3W(TCA, 0, h);
  1903.   end;
  1904. end;
  1905.  
  1906. procedure __TIA_LH_M(var TIA, tmp: TIntegerArray; const Lo, Hi: Integer);
  1907. var
  1908.   L, R, i, m: Integer;
  1909. begin
  1910.   if (Lo >= Hi) then
  1911.     Exit;
  1912.   m := (Lo + (Hi - Lo) div 2);
  1913.   __TIA_LH_M(TIA, tmp, Lo, m);
  1914.   __TIA_LH_M(TIA, tmp, (m + 1), Hi);
  1915.   L := Lo;
  1916.   R := (m + 1);
  1917.   for i := Lo to Hi do
  1918.     tmp[i] := TIA[i];
  1919.   for i := Lo to Hi do
  1920.     if (L > m) then
  1921.     begin
  1922.       TIA[i] := tmp[R];
  1923.       Inc(R);
  1924.     end else
  1925.       if (R > Hi) then
  1926.       begin
  1927.         TIA[i] := tmp[L];
  1928.         Inc(L);
  1929.       end else
  1930.         if (tmp[R] < tmp[L]) then
  1931.         begin
  1932.           TIA[i] := tmp[R];
  1933.           Inc(R);
  1934.         end else
  1935.         begin
  1936.           TIA[i] := tmp[L];
  1937.           Inc(L);
  1938.         end;
  1939. end;
  1940.  
  1941. procedure __TIA_HL_M(var TIA, tmp: TIntegerArray; const Lo, Hi: Integer);
  1942. var
  1943.   L, R, i, m: Integer;
  1944. begin
  1945.   if (Lo >= Hi) then
  1946.     Exit;
  1947.   m := (Lo + (Hi - Lo) div 2);
  1948.   __TIA_HL_M(TIA, tmp, Lo, m);
  1949.   __TIA_HL_M(TIA, tmp, (m + 1), Hi);
  1950.   L := Lo;
  1951.   R := (m + 1);
  1952.   for i := Lo to Hi do
  1953.     tmp[i] := TIA[i];
  1954.   for i := Lo to Hi do
  1955.     if (L > m) then
  1956.     begin
  1957.       TIA[i] := tmp[R];
  1958.       Inc(R);
  1959.     end else
  1960.       if (R > Hi) then
  1961.       begin
  1962.         TIA[i] := tmp[L];
  1963.         Inc(L);
  1964.       end else
  1965.         if (tmp[R] > tmp[L]) then
  1966.         begin
  1967.           TIA[i] := tmp[R];
  1968.           Inc(R);
  1969.         end else
  1970.         begin
  1971.           TIA[i] := tmp[L];
  1972.           Inc(L);
  1973.         end;
  1974. end;
  1975.  
  1976. procedure __TEA_LH_M(var TEA, tmp: TExtendedArray; const Lo, Hi: Integer);
  1977. var
  1978.   L, R, i, m: Integer;
  1979. begin
  1980.   if (Lo >= Hi) then
  1981.     Exit;
  1982.   m := (Lo + (Hi - Lo) div 2);
  1983.   __TEA_LH_M(TEA, tmp, Lo, m);
  1984.   __TEA_LH_M(TEA, tmp, (m + 1), Hi);
  1985.   L := Lo;
  1986.   R := (m + 1);
  1987.   for i := Lo to Hi do
  1988.     tmp[i] := TEA[i];
  1989.   for i := Lo to Hi do
  1990.     if (L > m) then
  1991.     begin
  1992.       TEA[i] := tmp[R];
  1993.       Inc(R);
  1994.     end else
  1995.       if (R > Hi) then
  1996.       begin
  1997.         TEA[i] := tmp[L];
  1998.         Inc(L);
  1999.       end else
  2000.         if (tmp[R] < tmp[L]) then
  2001.         begin
  2002.           TEA[i] := tmp[R];
  2003.           Inc(R);
  2004.         end else
  2005.         begin
  2006.           TEA[i] := tmp[L];
  2007.           Inc(L);
  2008.         end;
  2009. end;
  2010.  
  2011. procedure __TEA_HL_M(var TEA, tmp: TExtendedArray; const Lo, Hi: Integer);
  2012. var
  2013.   L, R, i, m: Integer;
  2014. begin
  2015.   if (Lo >= Hi) then
  2016.     Exit;
  2017.   m := (Lo + (Hi - Lo) div 2);
  2018.   __TEA_HL_M(TEA, tmp, Lo, m);
  2019.   __TEA_HL_M(TEA, tmp, (m + 1), Hi);
  2020.   L := Lo;
  2021.   R := (m + 1);
  2022.   for i := Lo to Hi do
  2023.     tmp[i] := TEA[i];
  2024.   for i := Lo to Hi do
  2025.     if (L > m) then
  2026.     begin
  2027.       TEA[i] := tmp[R];
  2028.       Inc(R);
  2029.     end else
  2030.       if (R > Hi) then
  2031.       begin
  2032.         TEA[i] := tmp[L];
  2033.         Inc(L);
  2034.       end else
  2035.         if (tmp[R] > tmp[L]) then
  2036.         begin
  2037.           TEA[i] := tmp[R];
  2038.           Inc(R);
  2039.         end else
  2040.         begin
  2041.           TEA[i] := tmp[L];
  2042.           Inc(L);
  2043.         end;
  2044. end;
  2045.  
  2046. procedure __TSA_LH_M(var TSA, tmp: TStringArray; const Lo, Hi: Integer);
  2047. var
  2048.   L, R, i, m: Integer;
  2049. begin
  2050.   if (Lo >= Hi) then
  2051.     Exit;
  2052.   m := (Lo + (Hi - Lo) div 2);
  2053.   __TSA_LH_M(TSA, tmp, Lo, m);
  2054.   __TSA_LH_M(TSA, tmp, (m + 1), Hi);
  2055.   L := Lo;
  2056.   R := (m + 1);
  2057.   for i := Lo to Hi do
  2058.     tmp[i] := TSA[i];
  2059.   for i := Lo to Hi do
  2060.     if (L > m) then
  2061.     begin
  2062.       TSA[i] := tmp[R];
  2063.       Inc(R);
  2064.     end else
  2065.       if (R > Hi) then
  2066.       begin
  2067.         TSA[i] := tmp[L];
  2068.         Inc(L);
  2069.       end else
  2070.         if (tmp[R] < tmp[L]) then
  2071.         begin
  2072.           TSA[i] := tmp[R];
  2073.           Inc(R);
  2074.         end else
  2075.         begin
  2076.           TSA[i] := tmp[L];
  2077.           Inc(L);
  2078.         end;
  2079. end;
  2080.  
  2081. procedure __TSA_HL_M(var TSA, tmp: TStringArray; const Lo, Hi: Integer);
  2082. var
  2083.   L, R, i, m: Integer;
  2084. begin
  2085.   if (Lo >= Hi) then
  2086.     Exit;
  2087.   m := (Lo + (Hi - Lo) div 2);
  2088.   __TSA_HL_M(TSA, tmp, Lo, m);
  2089.   __TSA_HL_M(TSA, tmp, (m + 1), Hi);
  2090.   L := Lo;
  2091.   R := (m + 1);
  2092.   for i := Lo to Hi do
  2093.     tmp[i] := TSA[i];
  2094.   for i := Lo to Hi do
  2095.     if (L > m) then
  2096.     begin
  2097.       TSA[i] := tmp[R];
  2098.       Inc(R);
  2099.     end else
  2100.       if (R > Hi) then
  2101.       begin
  2102.         TSA[i] := tmp[L];
  2103.         Inc(L);
  2104.       end else
  2105.         if (tmp[R] > tmp[L]) then
  2106.         begin
  2107.           TSA[i] := tmp[R];
  2108.           Inc(R);
  2109.         end else
  2110.         begin
  2111.           TSA[i] := tmp[L];
  2112.           Inc(L);
  2113.         end;
  2114. end;
  2115.  
  2116. procedure __TCA_LH_M(var TCA, tmp: array of Char; const Lo, Hi: Integer);
  2117. var
  2118.   L, R, i, m: Integer;
  2119. begin
  2120.   if (Lo >= Hi) then
  2121.     Exit;
  2122.   m := (Lo + (Hi - Lo) div 2);
  2123.   __TCA_LH_M(TCA, tmp, Lo, m);
  2124.   __TCA_LH_M(TCA, tmp, (m + 1), Hi);
  2125.   L := Lo;
  2126.   R := (m + 1);
  2127.   for i := Lo to Hi do
  2128.     tmp[i] := TCA[i];
  2129.   for i := Lo to Hi do
  2130.     if (L > m) then
  2131.     begin
  2132.       TCA[i] := tmp[R];
  2133.       Inc(R);
  2134.     end else
  2135.       if (R > Hi) then
  2136.       begin
  2137.         TCA[i] := tmp[L];
  2138.         Inc(L);
  2139.       end else
  2140.         if (tmp[R] < tmp[L]) then
  2141.         begin
  2142.           TCA[i] := tmp[R];
  2143.           Inc(R);
  2144.         end else
  2145.         begin
  2146.           TCA[i] := tmp[L];
  2147.           Inc(L);
  2148.         end;
  2149. end;
  2150.  
  2151. procedure __TCA_HL_M(var TCA, tmp: array of Char; const Lo, Hi: Integer);
  2152. var
  2153.   L, R, i, m: Integer;
  2154. begin
  2155.   if (Lo >= Hi) then
  2156.     Exit;
  2157.   m := (Lo + (Hi - Lo) div 2);
  2158.   __TCA_HL_M(TCA, tmp, Lo, m);
  2159.   __TCA_HL_M(TCA, tmp, (m + 1), Hi);
  2160.   L := Lo;
  2161.   R := (m + 1);
  2162.   for i := Lo to Hi do
  2163.     tmp[i] := TCA[i];
  2164.   for i := Lo to Hi do
  2165.     if (L > m) then
  2166.     begin
  2167.       TCA[i] := tmp[R];
  2168.       Inc(R);
  2169.     end else
  2170.       if (R > Hi) then
  2171.       begin
  2172.         TCA[i] := tmp[L];
  2173.         Inc(L);
  2174.       end else
  2175.         if (tmp[R] > tmp[L]) then
  2176.         begin
  2177.           TCA[i] := tmp[R];
  2178.           Inc(R);
  2179.         end else
  2180.         begin
  2181.           TCA[i] := tmp[L];
  2182.           Inc(L);
  2183.         end;
  2184. end;
  2185.  
  2186. procedure TIAMergeSort(var TIA: TIntegerArray; order: TSortOrder);
  2187. var
  2188.   l: Integer;
  2189.   t: TIntegerArray;
  2190. begin
  2191.   l := Length(TIA);
  2192.   if (l > 1) then
  2193.   begin
  2194.     SetLength(t, l);
  2195.     case order of
  2196.       so_LowToHigh: __TIA_LH_M(TIA, t, 0, (l - 1));
  2197.       so_HighToLow: __TIA_HL_M(TIA, t, 0, (l - 1));
  2198.     end;
  2199.   end;
  2200. end;
  2201.  
  2202. procedure TSAMergeSort(var TSA: TStringArray; order: TSortOrder);
  2203. var
  2204.   l: Integer;
  2205.   t: TStringArray;
  2206. begin
  2207.   l := Length(TSA);
  2208.   if (l > 1) then
  2209.   begin
  2210.     SetLength(t, l);
  2211.     case order of
  2212.       so_LowToHigh: __TSA_LH_M(TSA, t, 0, (l - 1));
  2213.       so_HighToLow: __TSA_HL_M(TSA, t, 0, (l - 1));
  2214.     end;
  2215.   end;
  2216. end;
  2217.  
  2218. procedure TEAMergeSort(var TEA: TExtendedArray; order: TSortOrder);
  2219. var
  2220.   l: Integer;
  2221.   t: TExtendedArray;
  2222. begin
  2223.   l := Length(TEA);
  2224.   if (l > 1) then
  2225.   begin
  2226.     SetLength(t, l);
  2227.     case order of
  2228.       so_LowToHigh: __TEA_LH_M(TEA, t, 0, (l - 1));
  2229.       so_HighToLow: __TEA_HL_M(TEA, t, 0, (l - 1));
  2230.     end;
  2231.   end;
  2232. end;
  2233.  
  2234. procedure TCAMergeSort(var TCA: array of Char; order: TSortOrder);
  2235. var
  2236.   l: Integer;
  2237.   t: array of Char;
  2238. begin
  2239.   l := Length(TCA);
  2240.   if (l > 1) then
  2241.   begin
  2242.     SetLength(t, l);
  2243.     case order of
  2244.       so_LowToHigh: __TCA_LH_M(TCA, t, 0, (l - 1));
  2245.       so_HighToLow: __TCA_HL_M(TCA, t, 0, (l - 1));
  2246.     end;
  2247.   end;
  2248. end;
  2249.  
  2250. procedure __TIA_LH_MBU(var TIA, tmp: TIntegerArray; const Lo, Mid, Hi: Integer);
  2251. var
  2252.   L, R, i: Integer;
  2253. begin
  2254.   L := Lo;
  2255.   R := (Mid + 1);
  2256.   for i := Lo to Hi do
  2257.     tmp[i] := TIA[i];
  2258.   for i := Lo to Hi do
  2259.     if (L > Mid) then
  2260.     begin
  2261.       TIA[i] := tmp[R];
  2262.       Inc(R);
  2263.     end else
  2264.       if (R > Hi) then
  2265.       begin
  2266.         TIA[i] := tmp[L];
  2267.         Inc(L);
  2268.       end else
  2269.         if (tmp[R] < tmp[L]) then
  2270.         begin
  2271.           TIA[i] := tmp[R];
  2272.           Inc(R);
  2273.         end else
  2274.         begin
  2275.           TIA[i] := tmp[L];
  2276.           Inc(L);
  2277.         end;
  2278. end;
  2279.  
  2280. procedure __TIA_HL_MBU(var TIA, tmp: TIntegerArray; const Lo, Mid, Hi: Integer);
  2281. var
  2282.   L, R, i: Integer;
  2283. begin
  2284.   L := Lo;
  2285.   R := (Mid + 1);
  2286.   for i := Lo to Hi do
  2287.     tmp[i] := TIA[i];
  2288.   for i := Lo to Hi do
  2289.     if (L > Mid) then
  2290.     begin
  2291.       TIA[i] := tmp[R];
  2292.       Inc(R);
  2293.     end else
  2294.       if (R > Hi) then
  2295.       begin
  2296.         TIA[i] := tmp[L];
  2297.         Inc(L);
  2298.       end else
  2299.         if (tmp[R] > tmp[L]) then
  2300.         begin
  2301.           TIA[i] := tmp[R];
  2302.           Inc(R);
  2303.         end else
  2304.         begin
  2305.           TIA[i] := tmp[L];
  2306.           Inc(L);
  2307.         end;
  2308. end;
  2309.  
  2310. procedure __TEA_LH_MBU(var TEA, tmp: TExtendedArray; const Lo, Mid, Hi: Integer);
  2311. var
  2312.   L, R, i: Integer;
  2313. begin
  2314.   L := Lo;
  2315.   R := (Mid + 1);
  2316.   for i := Lo to Hi do
  2317.     tmp[i] := TEA[i];
  2318.   for i := Lo to Hi do
  2319.     if (L > Mid) then
  2320.     begin
  2321.       TEA[i] := tmp[R];
  2322.       Inc(R);
  2323.     end else
  2324.       if (R > Hi) then
  2325.       begin
  2326.         TEA[i] := tmp[L];
  2327.         Inc(L);
  2328.       end else
  2329.         if (tmp[R] < tmp[L]) then
  2330.         begin
  2331.           TEA[i] := tmp[R];
  2332.           Inc(R);
  2333.         end else
  2334.         begin
  2335.           TEA[i] := tmp[L];
  2336.           Inc(L);
  2337.         end;
  2338. end;
  2339.  
  2340. procedure __TEA_HL_MBU(var TEA, tmp: TExtendedArray; const Lo, Mid, Hi: Integer);
  2341. var
  2342.   L, R, i: Integer;
  2343. begin
  2344.   L := Lo;
  2345.   R := (Mid + 1);
  2346.   for i := Lo to Hi do
  2347.     tmp[i] := TEA[i];
  2348.   for i := Lo to Hi do
  2349.     if (L > Mid) then
  2350.     begin
  2351.       TEA[i] := tmp[R];
  2352.       Inc(R);
  2353.     end else
  2354.       if (R > Hi) then
  2355.       begin
  2356.         TEA[i] := tmp[L];
  2357.         Inc(L);
  2358.       end else
  2359.         if (tmp[R] > tmp[L]) then
  2360.         begin
  2361.           TEA[i] := tmp[R];
  2362.           Inc(R);
  2363.         end else
  2364.         begin
  2365.           TEA[i] := tmp[L];
  2366.           Inc(L);
  2367.         end;
  2368. end;
  2369.  
  2370. procedure __TSA_LH_MBU(var TSA, tmp: TStringArray; const Lo, Mid, Hi: Integer);
  2371. var
  2372.   L, R, i: Integer;
  2373. begin
  2374.   L := Lo;
  2375.   R := (Mid + 1);
  2376.   for i := Lo to Hi do
  2377.     tmp[i] := TSA[i];
  2378.   for i := Lo to Hi do
  2379.     if (L > Mid) then
  2380.     begin
  2381.       TSA[i] := tmp[R];
  2382.       Inc(R);
  2383.     end else
  2384.       if (R > Hi) then
  2385.       begin
  2386.         TSA[i] := tmp[L];
  2387.         Inc(L);
  2388.       end else
  2389.         if (tmp[R] < tmp[L]) then
  2390.         begin
  2391.           TSA[i] := tmp[R];
  2392.           Inc(R);
  2393.         end else
  2394.         begin
  2395.           TSA[i] := tmp[L];
  2396.           Inc(L);
  2397.         end;
  2398. end;
  2399.  
  2400. procedure __TSA_HL_MBU(var TSA, tmp: TStringArray; const Lo, Mid, Hi: Integer);
  2401. var
  2402.   L, R, i: Integer;
  2403. begin
  2404.   L := Lo;
  2405.   R := (Mid + 1);
  2406.   for i := Lo to Hi do
  2407.     tmp[i] := TSA[i];
  2408.   for i := Lo to Hi do
  2409.     if (L > Mid) then
  2410.     begin
  2411.       TSA[i] := tmp[R];
  2412.       Inc(R);
  2413.     end else
  2414.       if (R > Hi) then
  2415.       begin
  2416.         TSA[i] := tmp[L];
  2417.         Inc(L);
  2418.       end else
  2419.         if (tmp[R] > tmp[L]) then
  2420.         begin
  2421.           TSA[i] := tmp[R];
  2422.           Inc(R);
  2423.         end else
  2424.         begin
  2425.           TSA[i] := tmp[L];
  2426.           Inc(L);
  2427.         end;
  2428. end;
  2429.  
  2430. procedure __TCA_LH_MBU(var TCA, tmp: array of Char; const Lo, Mid, Hi: Integer);
  2431. var
  2432.   L, R, i: Integer;
  2433. begin
  2434.   L := Lo;
  2435.   R := (Mid + 1);
  2436.   for i := Lo to Hi do
  2437.     tmp[i] := TCA[i];
  2438.   for i := Lo to Hi do
  2439.     if (L > Mid) then
  2440.     begin
  2441.       TCA[i] := tmp[R];
  2442.       Inc(R);
  2443.     end else
  2444.       if (R > Hi) then
  2445.       begin
  2446.         TCA[i] := tmp[L];
  2447.         Inc(L);
  2448.       end else
  2449.         if (tmp[R] < tmp[L]) then
  2450.         begin
  2451.           TCA[i] := tmp[R];
  2452.           Inc(R);
  2453.         end else
  2454.         begin
  2455.           TCA[i] := tmp[L];
  2456.           Inc(L);
  2457.         end;
  2458. end;
  2459.  
  2460. procedure __TCA_HL_MBU(var TCA, tmp: array of Char; const Lo, Mid, Hi: Integer);
  2461. var
  2462.   L, R, i: Integer;
  2463. begin
  2464.   L := Lo;
  2465.   R := (Mid + 1);
  2466.   for i := Lo to Hi do
  2467.     tmp[i] := TCA[i];
  2468.   for i := Lo to Hi do
  2469.     if (L > Mid) then
  2470.     begin
  2471.       TCA[i] := tmp[R];
  2472.       Inc(R);
  2473.     end else
  2474.       if (R > Hi) then
  2475.       begin
  2476.         TCA[i] := tmp[L];
  2477.         Inc(L);
  2478.       end else
  2479.         if (tmp[R] > tmp[L]) then
  2480.         begin
  2481.           TCA[i] := tmp[R];
  2482.           Inc(R);
  2483.         end else
  2484.         begin
  2485.           TCA[i] := tmp[L];
  2486.           Inc(L);
  2487.         end;
  2488. end;
  2489.  
  2490. procedure TIAMergeSortBU(var TIA: TIntegerArray; order: TSortOrder);
  2491. var
  2492.   l, s, Lo: Integer;
  2493.   tmp: TIntegerArray;
  2494. begin
  2495.   l := Length(TIA);
  2496.   if (l > 1) then
  2497.   begin
  2498.     SetLength(tmp, l);
  2499.     s := 1;
  2500.     case order of
  2501.       so_LowToHigh:
  2502.       while (s < l) do
  2503.       begin
  2504.         Lo := 0;
  2505.         while (Lo < (l - s)) do
  2506.         begin
  2507.           __TIA_LH_MBU(TIA, tmp, Lo, ((Lo + s) - 1), Min(((Lo + (s * 2)) - 1), (l - 1)));
  2508.           IncEx(Lo, (s * 2));
  2509.         end;
  2510.         IncEx(s, s);
  2511.       end;
  2512.       so_HighToLow:
  2513.       while (s < l) do
  2514.       begin
  2515.         Lo := 0;
  2516.         while (Lo < (l - s)) do
  2517.         begin
  2518.           __TIA_HL_MBU(TIA, tmp, Lo, ((Lo + s) - 1), Min(((Lo + (s * 2)) - 1), (l - 1)));
  2519.           IncEx(Lo, (s * 2));
  2520.         end;
  2521.         IncEx(s, s);
  2522.       end;
  2523.     end;
  2524.   end;
  2525. end;
  2526.  
  2527. procedure TSAMergeSortBU(var TSA: TStringArray; order: TSortOrder);
  2528. var
  2529.   l, s, Lo: Integer;
  2530.   tmp: TStringArray;
  2531. begin
  2532.   l := Length(TSA);
  2533.   if (l > 1) then
  2534.   begin
  2535.     SetLength(tmp, l);
  2536.     s := 1;
  2537.     case order of
  2538.       so_LowToHigh:
  2539.       while (s < l) do
  2540.       begin
  2541.         Lo := 0;
  2542.         while (Lo < (l - s)) do
  2543.         begin
  2544.           __TSA_LH_MBU(TSA, tmp, Lo, ((Lo + s) - 1), Min(((Lo + (s * 2)) - 1), (l - 1)));
  2545.           IncEx(Lo, (s * 2));
  2546.         end;
  2547.         IncEx(s, s);
  2548.       end;
  2549.       so_HighToLow:
  2550.       while (s < l) do
  2551.       begin
  2552.         Lo := 0;
  2553.         while (Lo < (l - s)) do
  2554.         begin
  2555.           __TSA_HL_MBU(TSA, tmp, Lo, ((Lo + s) - 1), Min(((Lo + (s * 2)) - 1), (l - 1)));
  2556.           IncEx(Lo, (s * 2));
  2557.         end;
  2558.         IncEx(s, s);
  2559.       end;
  2560.     end;
  2561.   end;
  2562. end;
  2563.  
  2564. procedure TEAMergeSortBU(var TEA: TExtendedArray; order: TSortOrder);
  2565. var
  2566.   l, s, Lo: Integer;
  2567.   tmp: TExtendedArray;
  2568. begin
  2569.   l := Length(TEA);
  2570.   if (l > 1) then
  2571.   begin
  2572.     SetLength(tmp, l);
  2573.     s := 1;
  2574.     case order of
  2575.       so_LowToHigh:
  2576.       while (s < l) do
  2577.       begin
  2578.         Lo := 0;
  2579.         while (Lo < (l - s)) do
  2580.         begin
  2581.           __TEA_LH_MBU(TEA, tmp, Lo, ((Lo + s) - 1), Min(((Lo + (s * 2)) - 1), (l - 1)));
  2582.           IncEx(Lo, (s * 2));
  2583.         end;
  2584.         IncEx(s, s);
  2585.       end;
  2586.       so_HighToLow:
  2587.       while (s < l) do
  2588.       begin
  2589.         Lo := 0;
  2590.         while (Lo < (l - s)) do
  2591.         begin
  2592.           __TEA_HL_MBU(TEA, tmp, Lo, ((Lo + s) - 1), Min(((Lo + (s * 2)) - 1), (l - 1)));
  2593.           IncEx(Lo, (s * 2));
  2594.         end;
  2595.         IncEx(s, s);
  2596.       end;
  2597.     end;
  2598.   end;
  2599. end;
  2600.  
  2601. procedure TCAMergeSortBU(var TCA: array of Char; order: TSortOrder);
  2602. var
  2603.   l, s, Lo: Integer;
  2604.   tmp: array of Char;
  2605. begin
  2606.   l := Length(TCA);
  2607.   if (l > 1) then
  2608.   begin
  2609.     SetLength(tmp, l);
  2610.     s := 1;
  2611.     case order of
  2612.       so_LowToHigh:
  2613.       while (s < l) do
  2614.       begin
  2615.         Lo := 0;
  2616.         while (Lo < (l - s)) do
  2617.         begin
  2618.           __TCA_LH_MBU(TCA, tmp, Lo, ((Lo + s) - 1), Min(((Lo + (s * 2)) - 1), (l - 1)));
  2619.           IncEx(Lo, (s * 2));
  2620.         end;
  2621.         IncEx(s, s);
  2622.       end;
  2623.       so_HighToLow:
  2624.       while (s < l) do
  2625.       begin
  2626.         Lo := 0;
  2627.         while (Lo < (l - s)) do
  2628.         begin
  2629.           __TCA_HL_MBU(TCA, tmp, Lo, ((Lo + s) - 1), Min(((Lo + (s * 2)) - 1), (l - 1)));
  2630.           IncEx(Lo, (s * 2));
  2631.         end;
  2632.         IncEx(s, s);
  2633.       end;
  2634.     end;
  2635.   end;
  2636. end;
  2637.  
  2638. procedure TIASort(var TIA: TIntegerArray; algorithm: TSortAlgorithm; order: TSortOrder);
  2639. begin
  2640.   case algorithm of
  2641.     sa_BubbleSort: TIABubbleSort(TIA, order);
  2642.     sa_InsertionSort: TIAInsertionSort(TIA, order);
  2643.     sa_QuickSort3W: TIAQuickSort3W(TIA, order);
  2644.     sa_QuickSort: TIAQuickSort(TIA, order);
  2645.     sa_ShellSort: TIAShellSort(TIA, order);
  2646.     sa_SelectionSort: TIASelectionSort(TIA, order);
  2647.     sa_JnlbSort: TIAJnlbSort(TIA, order);
  2648.     sa_JnlbSortDnmc: TIAJnlbSortDnmc(TIA, order);
  2649.     sa_HeapSort: TIAHeapSort(TIA, order);
  2650.     sa_MergeSort: TIAMergeSort(TIA, order);
  2651.     sa_MergeSortBU: TIAMergeSortBU(TIA, order);
  2652.   end;
  2653. end;
  2654.  
  2655. procedure TSASort(var TSA: TStringArray; algorithm: TSortAlgorithm; order: TSortOrder);
  2656. begin
  2657.   case algorithm of
  2658.     sa_BubbleSort: TSABubbleSort(TSA, order);
  2659.     sa_InsertionSort: TSAInsertionSort(TSA, order);
  2660.     sa_QuickSort3W: TSAQuickSort3W(TSA, order);
  2661.     sa_QuickSort: TSAQuickSort(TSA, order);
  2662.     sa_ShellSort: TSAShellSort(TSA, order);
  2663.     sa_SelectionSort: TSASelectionSort(TSA, order);
  2664.     sa_JnlbSort: TSAJnlbSort(TSA, order);
  2665.     sa_JnlbSortDnmc: TSAJnlbSortDnmc(TSA, order);
  2666.     sa_HeapSort: TSAHeapSort(TSA, order);
  2667.     sa_MergeSort: TSAMergeSort(TSA, order);
  2668.     sa_MergeSortBU: TSAMergeSortBU(TSA, order);
  2669.   end;
  2670. end;
  2671.  
  2672. procedure TEASort(var TEA: TExtendedArray; algorithm: TSortAlgorithm; order: TSortOrder);
  2673. begin
  2674.   case algorithm of
  2675.     sa_BubbleSort: TEABubbleSort(TEA, order);
  2676.     sa_InsertionSort: TEAInsertionSort(TEA, order);
  2677.     sa_QuickSort3W: TEAQuickSort3W(TEA, order);
  2678.     sa_QuickSort: TEAQuickSort(TEA, order);
  2679.     sa_ShellSort: TEAShellSort(TEA, order);
  2680.     sa_SelectionSort: TEASelectionSort(TEA, order);
  2681.     sa_JnlbSort: TEAJnlbSort(TEA, order);
  2682.     sa_JnlbSortDnmc: TEAJnlbSortDnmc(TEA, order);
  2683.     sa_HeapSort: TEAHeapSort(TEA, order);
  2684.     sa_MergeSort: TEAMergeSort(TEA, order);
  2685.     sa_MergeSortBU: TEAMergeSortBU(TEA, order);
  2686.   end;
  2687. end;
  2688.  
  2689. procedure TCASort(var TCA: array of Char; algorithm: TSortAlgorithm; order: TSortOrder);
  2690. begin
  2691.   case algorithm of
  2692.     sa_BubbleSort: TCABubbleSort(TCA, order);
  2693.     sa_InsertionSort: TCAInsertionSort(TCA, order);
  2694.     sa_QuickSort3W: TCAQuickSort3W(TCA, order);
  2695.     sa_QuickSort: TCAQuickSort(TCA, order);
  2696.     sa_ShellSort: TCAShellSort(TCA, order);
  2697.     sa_SelectionSort: TCASelectionSort(TCA, order);
  2698.     sa_JnlbSort: TCAJnlbSort(TCA, order);
  2699.     sa_JnlbSortDnmc: TCAJnlbSortDnmc(TCA, order);
  2700.     sa_HeapSort: TCAHeapSort(TCA, order);
  2701.     sa_MergeSort: TCAMergeSort(TCA, order);
  2702.     sa_MergeSortBU: TCAMergeSortBU(TCA, order);
  2703.   end;
  2704. end;
  2705.  
  2706. {==============================================================================]
  2707.   Explanation: Returns a TIA that contains all the value from start value (aStart) to finishing value (aFinish)..
  2708. [==============================================================================}
  2709. function TIAByRange(aStart, aFinish: Integer): TIntegerArray;
  2710. var
  2711.   i, s, f: Integer;
  2712. begin
  2713.   if (aStart <> aFinish) then
  2714.   begin
  2715.     s := Integer(aStart);
  2716.     f := Integer(aFinish);
  2717.     SetLength(Result, (IAbs(aStart - aFinish) + 1));
  2718.     case (aStart > aFinish) of
  2719.       True:
  2720.       for i := s downto f do
  2721.         Result[(s - i)] := i;
  2722.       False:
  2723.       for i := s to f do
  2724.         Result[(i - s)] := i;
  2725.     end;
  2726.   end else
  2727.     Result := [Integer(aStart)];
  2728. end;
  2729.  
  2730. {==============================================================================]
  2731.   Explanation: Returns a TIA that contains all the value from start value (aStart) to finishing value (aFinish)..
  2732.   NOTE: Works with 2-bit method, that cuts loop in half.
  2733. [==============================================================================}
  2734. function TIAByRange2bit(aStart, aFinish: Integer): TIntegerArray;
  2735. var
  2736.   g, l, i, s, f: Integer;
  2737. begin
  2738.   if (aStart <> aFinish) then
  2739.   begin
  2740.     s := Integer(aStart);
  2741.     f := Integer(aFinish);
  2742.     l := (IAbs(aStart - aFinish) + 1);
  2743.     SetLength(Result, l);
  2744.     g := ((l - 1) div 2);
  2745.     case (aStart < aFinish) of
  2746.       True:
  2747.       begin
  2748.         for i := 0 to g do
  2749.         begin
  2750.           Result[i] := (s + i);
  2751.           Result[((l - 1) - i)] := (f - i);
  2752.         end;
  2753.         if ((l mod 2) <> 0) then
  2754.           Result[i] := (s + i);
  2755.       end;
  2756.       False:
  2757.       begin
  2758.         for i := 0 to g do
  2759.         begin
  2760.           Result[i] := (s - i);
  2761.           Result[((l - 1) - i)] := (f + i);
  2762.         end;
  2763.         if ((l mod 2) <> 0) then
  2764.           Result[i] := (s - i);
  2765.       end;
  2766.     end;
  2767.   end else
  2768.     Result := [Integer(aStart)];
  2769. end;
  2770.  
  2771. {==============================================================================]
  2772.   Explanation: Randomizes TIA.
  2773.                Example: [1, 2, 3] => [2, 3, 1]
  2774.                The higher count of shuffles is, the "stronger" randomization you'll get.
  2775. [==============================================================================}
  2776. procedure TIARandomizeEx(var TIA: TIntegerArray; shuffles: Integer);
  2777. var
  2778.   l, i, t: Integer;
  2779. begin
  2780.   l := Length(TIA);
  2781.   if ((l > 1) and (shuffles > 0)) then
  2782.     for t := 1 to shuffles do
  2783.       for i := 0 to (l - 1) do
  2784.         Swap(TIA[Random(l)], TIA[Random(l)]);
  2785. end;
  2786.  
  2787. {==============================================================================]
  2788.   Explanation: Fills TIA items with x.
  2789. [==============================================================================}
  2790. procedure TIAFillEx(var TIA: TIntegerArray; x: TIntegerArray);
  2791. var
  2792.   i, h, l: Integer;
  2793. begin
  2794.   h := High(TIA);
  2795.   l := Length(x);
  2796.   for i := 0 to h do
  2797.     TIA[i] := Integer(x[i mod l]);
  2798. end;
  2799.  
  2800. {==============================================================================]
  2801.   Explanation: Clones (a.K.a returns copy of) TIA.
  2802. [==============================================================================}
  2803. function TIAClone(TIA: TIntegerArray): TIntegerArray;
  2804. var
  2805.   h, i: Integer;
  2806. begin
  2807.   h := High(TIA);
  2808.   SetLength(Result, (h + 1));
  2809.   for i := 0 to h do
  2810.     Result[i] := Integer(TIA[i]);
  2811. end;
  2812.  
  2813. {==============================================================================]
  2814.   Explanation: Reverses TIA.
  2815. [==============================================================================}
  2816. procedure TIAReverse(var TIA: TIntegerArray);
  2817. var
  2818.   g, i, l: Integer;
  2819. begin
  2820.   l := (Length(TIA) - 1);
  2821.   if (l < 1) then
  2822.     Exit;
  2823.   g := (l div 2);
  2824.   for i := 0 to g do
  2825.     Swap(TIA[i], TIA[(l - i)]);
  2826. end;
  2827.  
  2828. procedure SortingTimer(TIA: TIntegerArray; algorithm: TSortAlgorithm);
  2829. var
  2830.   t: Integer;
  2831.   s: string;
  2832.   arr: TIntegerArray;
  2833. begin
  2834.   arr := TIAClone(TIA);
  2835.   t := GetSystemTime;
  2836.   case algorithm of
  2837.     sa_BubbleSort:
  2838.     begin
  2839.       TIABubbleSort(arr, so_LowToHigh);
  2840.       s := 'BubbleSort()';
  2841.     end;
  2842.     sa_HeapSort:
  2843.     begin
  2844.       TIAHeapSort(arr, so_LowToHigh);
  2845.       s := 'HeapSort()';
  2846.     end;
  2847.     sa_InsertionSort:
  2848.     begin
  2849.       TIAInsertionSort(arr, so_LowToHigh);
  2850.       s := 'InsertionSort()';
  2851.     end;
  2852.     sa_MergeSort:
  2853.     begin
  2854.       TIAMergeSort(arr, so_LowToHigh);
  2855.       s := 'MergeSort()';
  2856.     end;
  2857.     sa_MergeSortBU:
  2858.     begin
  2859.       TIAMergeSortBU(arr, so_LowToHigh);
  2860.       s := 'MergeSortBU()';
  2861.     end;
  2862.     sa_SelectionSort:
  2863.     begin
  2864.       TIASelectionSort(arr, so_LowToHigh);
  2865.       s := 'SelectionSort()';
  2866.     end;
  2867.     sa_ShellSort:
  2868.     begin
  2869.       TIAShellSort(arr, so_LowToHigh);
  2870.       s := 'ShellSort()';
  2871.     end;
  2872.     sa_QuickSort:
  2873.     begin
  2874.       TIAQuickSort(arr, so_LowToHigh);
  2875.       s := 'QuickSort()';
  2876.     end;
  2877.     sa_QuickSort3W:
  2878.     begin
  2879.       TIAQuickSort3W(arr, so_LowToHigh);
  2880.       s := 'QuickSort3W()';
  2881.     end;
  2882.     sa_JnlbSort:
  2883.     begin
  2884.       TIAJnlbSort(arr, so_LowToHigh);
  2885.       s := 'JnlbSort()';
  2886.     end;
  2887.     sa_JnlbSortDnmc:
  2888.     begin
  2889.       TIAJnlbSortDnmc(arr, so_LowToHigh);
  2890.       s := 'JnlbSortDnmc()';
  2891.     end;
  2892.   end;
  2893.   t := (GetSystemTime - t);
  2894.   WriteLn(MD5(ToStr(arr)) + ': ' + IntToStr(t) + ' ms. [' + s + ']');
  2895.   SetLength(arr, 0);
  2896. end;
  2897.  
  2898. var
  2899.   original: TIntegerArray;
  2900.  
  2901. begin
  2902.   ClearDebug;
  2903.   original := TIAByRange2bit(500, -500);
  2904.   WriteLn(MD5(ToStr(original)) + ' (REVERSED):');
  2905.  
  2906.   SortingTimer(original, sa_JnlbSort);
  2907.   SortingTimer(original, sa_JnlbSortDnmc);
  2908.   SortingTimer(original, sa_BubbleSort);
  2909.   SortingTimer(original, sa_ShellSort);
  2910.   SortingTimer(original, sa_SelectionSort);
  2911.   SortingTimer(original, sa_InsertionSort);
  2912.   SortingTimer(original, sa_MergeSort);
  2913.   SortingTimer(original, sa_MergeSortBU);
  2914.   SortingTimer(original, sa_HeapSort);
  2915.   SortingTimer(original, sa_QuickSort);
  2916.   SortingTimer(original, sa_QuickSort3W);
  2917.  
  2918.   WriteLn('');
  2919.   TIAReverse(original);
  2920.   WriteLn(MD5(ToStr(original)) + ' (ALREADY SORTED):');
  2921.  
  2922.   SortingTimer(original, sa_JnlbSort);
  2923.   SortingTimer(original, sa_JnlbSortDnmc);
  2924.   SortingTimer(original, sa_BubbleSort);
  2925.   SortingTimer(original, sa_ShellSort);
  2926.   SortingTimer(original, sa_SelectionSort);
  2927.   SortingTimer(original, sa_InsertionSort);
  2928.   SortingTimer(original, sa_MergeSort);
  2929.   SortingTimer(original, sa_MergeSortBU);
  2930.   SortingTimer(original, sa_HeapSort);
  2931.   SortingTimer(original, sa_QuickSort);
  2932.   SortingTimer(original, sa_QuickSort3W);
  2933.  
  2934.   WriteLn('');
  2935.   TIARandomizeEx(original, 2);
  2936.   WriteLn(MD5(ToStr(original)) + ' (RANDOMIZED):');
  2937.  
  2938.   SortingTimer(original, sa_JnlbSort);
  2939.   SortingTimer(original, sa_JnlbSortDnmc);
  2940.   SortingTimer(original, sa_BubbleSort);
  2941.   SortingTimer(original, sa_ShellSort);
  2942.   SortingTimer(original, sa_SelectionSort);
  2943.   SortingTimer(original, sa_InsertionSort);
  2944.   SortingTimer(original, sa_MergeSort);
  2945.   SortingTimer(original, sa_MergeSortBU);
  2946.   SortingTimer(original, sa_HeapSort);
  2947.   SortingTimer(original, sa_QuickSort);
  2948.   SortingTimer(original, sa_QuickSort3W);
  2949.  
  2950.   WriteLn('');
  2951.   TIAFillEx(original, [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384]);
  2952.   WriteLn(MD5(ToStr(original)) + ' ("FEW" UNIQUE):');
  2953.  
  2954.   SortingTimer(original, sa_JnlbSort);
  2955.   SortingTimer(original, sa_JnlbSortDnmc);
  2956.   SortingTimer(original, sa_BubbleSort);
  2957.   SortingTimer(original, sa_ShellSort);
  2958.   SortingTimer(original, sa_SelectionSort);
  2959.   SortingTimer(original, sa_InsertionSort);
  2960.   SortingTimer(original, sa_MergeSort);
  2961.   SortingTimer(original, sa_MergeSortBU);
  2962.   SortingTimer(original, sa_HeapSort);
  2963.   SortingTimer(original, sa_QuickSort);
  2964.   SortingTimer(original, sa_QuickSort3W);
  2965.  
  2966.   SetLength(original, 0);
  2967. end.
Advertisement
Add Comment
Please, Sign In to add comment