Advertisement
Janilabo

sorting.

Mar 7th, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 9.58 KB | None | 0 0
  1. {$loadlib MIMUPlugin.dll}
  2.  
  3. procedure SelectionSort(var arr: TIntegerArray);
  4. var
  5.   m, c, h, t: Integer;
  6. begin
  7.   for c := 0 to h do
  8.   begin
  9.     m := c;
  10.     for t := (c + 1) to h do
  11.       if (arr[m] < arr[t]) then
  12.         m := t;
  13.     Swap(arr[m], arr[c]);
  14.   end;
  15. end;
  16.  
  17. procedure BubbleSort(var arr: TIntegerArray);
  18. var
  19.   h, j, b, a: Integer;
  20. begin
  21.   if (mAssign(h, High(arr)) > 0) then
  22.   begin
  23.     j := (h - 1);
  24.     for a := 0 to j do
  25.       for b := 1 to h do
  26.         if (arr[(b - 1)] > arr[b]) then
  27.           Swap(arr[(b - 1)], arr[b]);
  28.   end;
  29. end;
  30.  
  31. procedure ShellSort(var arr: TIntegerArray);
  32. var
  33.   l, z, x, b, a: Integer;
  34. begin
  35.   if (mAssign(l, Length(arr)) > 1) then
  36.   begin
  37.     z := (l - 1);
  38.     x := 0;
  39.     while (x < (l div 3)) do
  40.       x := ((x * 3) + 1);
  41.     case (l > 2) of
  42.       True:
  43.       while (x >= 1) do
  44.       begin
  45.         for a := x to z do
  46.         begin
  47.           b := a;
  48.           while ((b >= x) and (arr[b] < arr[(b - x)])) do
  49.           begin
  50.             Swap(arr[b], arr[(b - x)]);
  51.             b := (b - x);
  52.           end;
  53.         end;
  54.         x := (x div 3);
  55.       end;
  56.       False:
  57.       if (arr[0] > arr[1]) then
  58.         Swap(arr[0], arr[1]);
  59.     end;
  60.   end;
  61. end;
  62.  
  63. procedure InsertionSort(var arr: TIntegerArray);
  64. var
  65.   h, a, b: Integer;
  66. begin
  67.   if (mAssign(h, High(arr)) > 0) then
  68.   for a := 1 to h do
  69.     for b := a downto 1 do
  70.       if (arr[(b - 1)] > arr[b]) then
  71.         Swap(arr[(b - 1)], arr[b])
  72.       else
  73.         Break;
  74. end;
  75.  
  76. procedure SortAlg10(var arr: TIntegerArray);
  77. var
  78.   l, h, i, c, s, d: Integer;
  79. begin
  80.   l := Length(arr);
  81.   if (l > 1) then
  82.   begin
  83.     d := 2;
  84.     c := l;
  85.     while (c > 0) do
  86.     begin
  87.       s := 0;
  88.       for i := 0 to (l - c) do
  89.         if (arr[i] > arr[(i + c)]) then
  90.         begin
  91.           Swap(arr[i], arr[(i + c)]);
  92.           s := (s + 1);
  93.         end;
  94.       if (s = 0) then
  95.       begin
  96.         c := (c div d);
  97.         d := (d + 1);
  98.       end;
  99.     end;
  100.   end;
  101. end;
  102.  
  103. procedure SortAlg9(var arr: TIntegerArray);
  104. var
  105.   l, h, i, c, s: Integer;
  106. begin
  107.   l := Length(arr);
  108.   if (l > 1) then
  109.   begin
  110.     c := (l div 2);
  111.     while (c > 0) do
  112.     begin
  113.       s := 0;
  114.       for i := 0 to ((l - c) - 1) do
  115.         if (arr[i] > arr[(i + c)]) then
  116.         begin
  117.           Swap(arr[i], arr[(i + c)]);
  118.           s := (s + 1);
  119.         end;
  120.       if (s = 0) then
  121.         c := (c div 2);
  122.     end;
  123.   end;
  124. end;
  125.  
  126. procedure SortAlg8(var arr: TIntegerArray);
  127. var
  128.   l, h, i, c, s: Integer;
  129. begin
  130.   l := Length(arr);
  131.   if (l > 1) then
  132.   begin
  133.     c := (l div 2);
  134.     while (c > 0) do
  135.     begin
  136.       s := 0;
  137.       for i := 0 to ((l - c) - 1) do
  138.         if (arr[i] > arr[(i + c)]) then
  139.         begin
  140.           Swap(arr[i], arr[(i + c)]);
  141.           s := (s + 1);
  142.         end;
  143.       if (s < 2) then
  144.         c := (c div 2);
  145.     end;
  146.   end;
  147. end;
  148.  
  149. procedure SortAlg7(var arr: TIntegerArray);
  150. var
  151.   l, h, i, c, s: Integer;
  152. begin
  153.   l := Length(arr);
  154.   if (l > 1) then
  155.   begin
  156.     c := l;
  157.     while (c > 0) do
  158.     begin
  159.       s := 0;
  160.       for i := 0 to ((l - c) - 1) do
  161.         if (arr[i] > arr[(i + c)]) then
  162.         begin
  163.           Swap(arr[i], arr[(i + c)]);
  164.           s := (s + 1);
  165.         end;
  166.       if (s < 2) then
  167.         c := (c div 2);
  168.     end;
  169.   end;
  170. end;
  171.  
  172. procedure SortAlg6(var arr: TIntegerArray);
  173. var
  174.   l, h, i, c: Integer;
  175.   s: Boolean;
  176. begin
  177.   l := Length(arr);
  178.   if (l > 1) then
  179.   begin
  180.     c := l;
  181.     while (c > 0) do
  182.     begin
  183.       s := False;
  184.       for i := 0 to ((l - c) - 1) do
  185.         if (arr[i] > arr[(i + c)]) then
  186.         begin
  187.           Swap(arr[i], arr[(i + c)]);
  188.           s := True;
  189.         end;
  190.       if not s then
  191.         c := (c div 2);
  192.     end;
  193.   end;
  194. end;
  195.  
  196. procedure SortAlg5(var arr: TIntegerArray);
  197. var
  198.   l, h, i, j, c, d: Integer;
  199. begin
  200.   h := High(arr);
  201.   if (h < 1) then
  202.     Exit;
  203.   case (h > 1) of
  204.     True:
  205.     for j := 1 to 2 do
  206.       for i := 0 to (h - j) do
  207.         if (arr[i] > arr[(i + j)]) then
  208.           Swap(arr[i], arr[(i + j)]);
  209.     False:
  210.     if (arr[0] > arr[1]) then
  211.       Swap(arr[0], arr[1]);
  212.   end;
  213. end;
  214.  
  215. procedure SortAlg(var arr: TIntegerArray);
  216. var
  217.   l, h, i, c: Integer;
  218. begin
  219.   l := Length(arr);
  220.   for c := l downto 1 do
  221.     for i := 0 to (l - c) do
  222.       if (arr[i] > arr[(i + c)]) then
  223.         Swap(arr[i], arr[(i + c)]);
  224. end;
  225.  
  226. procedure SortAlg4(var arr: TIntegerArray);
  227. var
  228.   l, h, i, c, d: Integer;
  229. begin
  230.   l := Length(arr);
  231.   if (l < 2) then
  232.     Exit;
  233.   d := (l div 2);
  234.   for c := d downto 1 do
  235.     for i := 0 to (l - c) do
  236.       if (arr[i] > arr[(i + c)]) then
  237.         Swap(arr[i], arr[(i + c)]);
  238. end;
  239.  
  240. procedure SortAlg2(var arr: TIntegerArray);
  241. var
  242.   l, h, i, c: Integer;
  243.   s: Boolean;
  244. begin
  245.   l := Length(arr);
  246.   if (l > 1) then
  247.   for c := l downto 1 do
  248.   begin
  249.     for i := 0 to (l - 1) do
  250.     begin
  251.       s := (arr[i] > arr[(i + 1)]);
  252.       if s then
  253.         Break;
  254.     end;
  255.     if not s then
  256.       Break;
  257.     for i := 0 to (l - c) do
  258.       if (arr[i] > arr[(i + c)]) then
  259.         Swap(arr[i], arr[(i + c)]);
  260.   end;
  261. end;
  262.  
  263. procedure SortAlg3(var arr: TIntegerArray);
  264. var
  265.   l, h, i, c: Integer;
  266.   s: Boolean;
  267. begin
  268.   l := Length(arr);
  269.   if (l > 1) then
  270.   for c := (l div 2) downto 1 do
  271.   begin
  272.     for i := 0 to (l - 1) do
  273.     begin
  274.       s := (arr[i] > arr[(i + 1)]);
  275.       if s then
  276.         Break;
  277.     end;
  278.     if not s then
  279.       Break;
  280.     for i := 0 to (l - c) do
  281.       if (arr[i] > arr[(i + c)]) then
  282.         Swap(arr[i], arr[(i + c)]);
  283.   end;
  284. end;
  285.  
  286. procedure QuickSort2(var arr: TIntegerArray; Lo, Hi: Integer); overload;
  287. var
  288.   A, L, R, C, T: Integer;
  289. begin
  290.   repeat
  291.     case ((Hi - Lo) > 16) of
  292.       True:
  293.       begin
  294.         C := arr[((Hi + Lo) shr 1)];
  295.         L := Lo;
  296.         R := Hi;
  297.         repeat
  298.           while (arr[L] < C) do
  299.             Inc(L);
  300.           while (arr[R] > C) do
  301.             Dec(R);
  302.           if (L <= R) then
  303.           begin
  304.             if (L <> R) then
  305.             begin
  306.               T := arr[L];
  307.               arr[L] := arr[R];
  308.               arr[R] := T;
  309.             end;
  310.             Inc(L);
  311.             Dec(R);
  312.           end;
  313.         until (R < L);
  314.         if (R > Lo) then
  315.           mQuickSortII(arr, Lo, R);
  316.         Lo := L;
  317.       end;
  318.       False:
  319.       begin
  320.         A := (Lo + 1);
  321.         for L := A to Hi do
  322.         begin
  323.           T := arr[L];
  324.           R := L;
  325.           while ((R > Lo) and (arr[(R - 1)] > T)) do
  326.           begin
  327.             arr[R] := arr[(R - 1)];
  328.             Dec(R);
  329.           end;
  330.           arr[R] := T;
  331.         end;
  332.         Exit;
  333.       end;
  334.     end;
  335.   until (Hi <= L);
  336. end;
  337.  
  338. procedure QuickSort2(var arr: TIntegerArray); overload;
  339. var
  340.   h: Integer;
  341. begin
  342.   if (mAssign(h, High(arr)) > 0) then
  343.     QuickSort2(arr, 0, h);
  344. end;
  345.  
  346. var
  347.   i, j, k, t: Integer;
  348.   x, y, z: TIntegerArray;
  349.   n: TStringArray;
  350.   a, b, c: string;
  351.  
  352. begin
  353.   ClearDebug;
  354.   n := ['ShellSort', 'QuickSort2', 'SortAlg6', 'SortAlg7', 'SortAlg8', 'SortAlg9'];
  355.   for i := 0 to 999 do
  356.   begin
  357.     x := mRandom(RandomRange(-9999, -5000), RandomRange(5000, 9999), RandomRange(5000, 25000), True);
  358.     mQuickSortII(x);
  359.     a := MD5(ToStr(x));
  360.     for j := 0 to 2 do
  361.     begin
  362.       case j of
  363.         0:
  364.         begin
  365.           c := '';
  366.           for k := 0 to 5 do
  367.           begin
  368.             y := mClone(x);
  369.             t := GetSystemTime;
  370.             case k of
  371.               0: ShellSort(y);
  372.               1: QuickSort2(y);
  373.               2: SortAlg6(y);
  374.               3: SortAlg7(y);
  375.               4: SortAlg8(y);
  376.               5: SortAlg9(y);
  377.             end;
  378.             b := MD5(ToStr(y));
  379.             if (a <> b) then
  380.             begin
  381.               WriteLn(n[k], ' FAILED.');
  382.               TerminateScript;
  383.             end;
  384.             c := (c + ' ' + ToStr(GetSystemTime - t) + ' ms. [' + n[k] + ']');
  385.             SetLength(y, 0);
  386.           end;
  387.           WriteLn('SORTED (', Length(x), '):' + c);
  388.         end;
  389.         1:
  390.         begin
  391.           z := mReversed(x);
  392.           c := '';
  393.           for k := 0 to 5 do
  394.           begin
  395.             y := mClone(z);
  396.             t := GetSystemTime;
  397.             case k of
  398.               0: ShellSort(y);
  399.               1: QuickSort2(y);
  400.               2: SortAlg6(y);
  401.               3: SortAlg7(y);
  402.               4: SortAlg8(y);
  403.               5: SortAlg9(y);
  404.             end;
  405.             b := MD5(ToStr(y));
  406.             if (a <> b) then
  407.             begin
  408.               WriteLn(n[k], ' FAILED.');
  409.               TerminateScript;
  410.             end;
  411.             c := (c + ' ' + ToStr(GetSystemTime - t) + ' ms. [' + n[k] + ']');
  412.             SetLength(y, 0);
  413.           end;
  414.           WriteLn('REVERSED (', Length(x), '):' + c);
  415.         end;
  416.         2:
  417.         begin
  418.           z := mClone(x);
  419.           mRandomize(z);
  420.           c := '';
  421.           for k := 0 to 5 do
  422.           begin
  423.             y := mClone(z);
  424.             t := GetSystemTime;
  425.             case k of
  426.               0: ShellSort(y);
  427.               1: QuickSort2(y);
  428.               2: SortAlg6(y);
  429.               3: SortAlg7(y);
  430.               4: SortAlg8(y);
  431.               5: SortAlg9(y);
  432.             end;
  433.             b := MD5(ToStr(y));
  434.             if (a <> b) then
  435.             begin
  436.               WriteLn(n[k], ' FAILED.');
  437.               TerminateScript;
  438.             end;
  439.             c := (c + ' ' + ToStr(GetSystemTime - t) + ' ms. [' + n[k] + ']');
  440.             SetLength(y, 0);
  441.           end;
  442.           WriteLn('SHUFFLED (', Length(x), '):' + c);
  443.         end;
  444.       end;
  445.     end;
  446.     WriteLn('');
  447.   end;
  448.   WriteLn('NO issues. :)');
  449. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement