Janilabo

Janilabo | sortingLib [SCAR Divi]

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