Advertisement
Janilabo

Array Sorting

Mar 7th, 2015
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 8.92 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 DivisionSort(var arr: TIntegerArray);
  77. var
  78.   l, h, i, c: Integer;
  79.   s: Boolean;
  80. begin
  81.   l := Length(arr);
  82.   if (l > 1) then
  83.   begin
  84.     c := (l - 1);
  85.     while (c > 0) do
  86.     begin
  87.       s := False;
  88.       for i := 0 to (l - (c + 1)) do
  89.         if (arr[i] > arr[(i + c)]) then
  90.         begin
  91.           Swap(arr[i], arr[(i + c)]);
  92.           s := True;
  93.         end;
  94.       if not s then
  95.         c := (c div 2);
  96.     end;
  97.   end;
  98. end;
  99.  
  100. procedure DivisionSortII(var arr: TIntegerArray);
  101. var
  102.   l, h, i, c: Integer;
  103.   s: Boolean;
  104. begin
  105.   l := Length(arr);
  106.   if (l > 1) then
  107.   begin
  108.     c := (l - 1);
  109.     while (c > 0) do
  110.     begin
  111.       s := False;
  112.       for i := 0 to (l - (c + 1)) do
  113.         if (arr[i] > arr[(i + c)]) then
  114.         begin
  115.           Swap(arr[i], arr[(i + c)]);
  116.           s := True;
  117.         end;
  118.       if not s then
  119.         c := (c div 2)
  120.       else
  121.         c := (c * 2);
  122.     end;
  123.   end;
  124. end;
  125.  
  126. procedure DivSort(var arr: TIntegerArray);
  127. var
  128.   l, h, i, c: Integer;
  129.   s: Boolean;
  130. begin
  131.   l := Length(arr);
  132.   if (l > 1) then
  133.   begin
  134.     c := (l div 2);
  135.     while (c > 0) do
  136.     begin
  137.       s := False;
  138.       for i := 0 to (l - (c + 1)) do
  139.         if (arr[i] > arr[(i + c)]) then
  140.         begin
  141.           Swap(arr[i], arr[(i + c)]);
  142.           s := True;
  143.         end;
  144.       if not s then
  145.         c := (c div 2);
  146.     end;
  147.   end;
  148. end;
  149.  
  150. procedure DivSortII(var arr: TIntegerArray);
  151. var
  152.   l, h, i, c: Integer;
  153.   s: Boolean;
  154. begin
  155.   l := Length(arr);
  156.   if (l > 1) then
  157.   begin
  158.     c := (l div 2);
  159.     while (c > 0) do
  160.     begin
  161.       s := False;
  162.       for i := 0 to (l - (c + 1)) do
  163.         if (arr[i] > arr[(i + c)]) then
  164.         begin
  165.           Swap(arr[i], arr[(i + c)]);
  166.           s := True;
  167.         end;
  168.       if not s then
  169.         c := (c div 2)
  170.       else
  171.         c := (c * 2);
  172.     end;
  173.   end;
  174. end;
  175.  
  176. procedure DivideSort(var arr: TIntegerArray);
  177. var
  178.   l, h, i, c: Integer;
  179.   s: Boolean;
  180. begin
  181.   l := Length(arr);
  182.   s := (l > 1);
  183.   while s do
  184.   begin
  185.     c := (l - 1);
  186.     s := False;
  187.     while (c > 0) do
  188.     begin
  189.       for i := 0 to (l - (c + 1)) do
  190.         if (arr[i] > arr[(i + c)]) then
  191.         begin
  192.           Swap(arr[i], arr[(i + c)]);
  193.           s := True;
  194.         end;
  195.       c := (c div 2);
  196.     end;
  197.   end;
  198. end;
  199.  
  200. procedure DivideSortII(var arr: TIntegerArray);
  201. var
  202.   l, h, i, c: Integer;
  203.   s: Boolean;
  204. begin
  205.   l := Length(arr);
  206.   s := (l > 1);
  207.   while s do
  208.   begin
  209.     c := (l div 2);
  210.     s := False;
  211.     while (c > 0) do
  212.     begin
  213.       for i := 0 to (l - (c + 1)) do
  214.         if (arr[i] > arr[(i + c)]) then
  215.         begin
  216.           Swap(arr[i], arr[(i + c)]);
  217.           s := True;
  218.         end;
  219.       c := (c div 2);
  220.     end;
  221.   end;
  222. end;
  223.  
  224. procedure ZoomSort(var arr: TIntegerArray);
  225. var
  226.   l, h, i, c: Integer;
  227. begin
  228.   l := Length(arr);
  229.   for c := (l - 1) downto 1 do
  230.     for i := 0 to (l - (c + 1)) do
  231.       if (arr[i] > arr[(i + c)]) then
  232.         Swap(arr[i], arr[(i + c)]);
  233. end;
  234.  
  235. procedure QuickSort2(var arr: TIntegerArray; Lo, Hi: Integer); overload;
  236. var
  237.   A, L, R, C, T: Integer;
  238. begin
  239.   repeat
  240.     case ((Hi - Lo) > 16) of
  241.       True:
  242.       begin
  243.         C := arr[((Hi + Lo) shr 1)];
  244.         L := Lo;
  245.         R := Hi;
  246.         repeat
  247.           while (arr[L] < C) do
  248.             Inc(L);
  249.           while (arr[R] > C) do
  250.             Dec(R);
  251.           if (L <= R) then
  252.           begin
  253.             if (L <> R) then
  254.             begin
  255.               T := arr[L];
  256.               arr[L] := arr[R];
  257.               arr[R] := T;
  258.             end;
  259.             Inc(L);
  260.             Dec(R);
  261.           end;
  262.         until (R < L);
  263.         if (R > Lo) then
  264.           mQuickSortII(arr, Lo, R);
  265.         Lo := L;
  266.       end;
  267.       False:
  268.       begin
  269.         A := (Lo + 1);
  270.         for L := A to Hi do
  271.         begin
  272.           T := arr[L];
  273.           R := L;
  274.           while ((R > Lo) and (arr[(R - 1)] > T)) do
  275.           begin
  276.             arr[R] := arr[(R - 1)];
  277.             Dec(R);
  278.           end;
  279.           arr[R] := T;
  280.         end;
  281.         Exit;
  282.       end;
  283.     end;
  284.   until (Hi <= L);
  285. end;
  286.  
  287. procedure QuickSort2(var arr: TIntegerArray); overload;
  288. var
  289.   h: Integer;
  290. begin
  291.   if (mAssign(h, High(arr)) > 0) then
  292.     QuickSort2(arr, 0, h);
  293. end;
  294.  
  295. var
  296.   i, j, k, t: Integer;
  297.   x, y, z: TIntegerArray;
  298.   n: TStringArray;
  299.   a, b, c: string;
  300.  
  301. begin
  302.   ClearDebug;
  303.   n := ['ShellSort', 'QuickSort2', 'DivisionSort', 'DivSort', 'DivSortII', 'DivideSort', 'DivisionSortII', 'DivideSortII', 'ZoomSort'];
  304.   for i := 9999 downto 0 do
  305.   begin
  306.     x := mRandom(RandomRange(-9999, -5000), RandomRange(5000, 9999), RandomRange(10, 15), True);
  307.     mQuickSortII(x);
  308.     a := MD5(ToStr(x));
  309.     for j := 0 to 2 do
  310.     begin
  311.       case j of
  312.         0:
  313.         begin
  314.           c := '';
  315.           for k := 2 to 8 do
  316.           begin
  317.             y := mClone(x);
  318.             t := GetSystemTime;
  319.             case k of
  320.               0: ShellSort(y);
  321.               1: QuickSort2(y);
  322.               2: DivisionSort(y);
  323.               3: DivSort(y);
  324.               4: DivSortII(y);
  325.               5: DivideSort(y);
  326.               6: DivisionSortII(y);
  327.               7: DivideSortII(y);
  328.               8: ZoomSort(y);
  329.             end;
  330.             b := MD5(ToStr(y));
  331.             if (a <> b) then
  332.             begin
  333.               WriteLn(n[k], ' FAILED.');
  334.               TerminateScript;
  335.             end;
  336.             c := (c + ' ' + ToStr(GetSystemTime - t) + ' ms. [' + n[k] + ']');
  337.             SetLength(y, 0);
  338.           end;
  339.           WriteLn('SORTED (', Length(x), '):' + c);
  340.         end;
  341.         1:
  342.         begin
  343.           z := mReversed(x);
  344.           c := '';
  345.           for k := 2 to 8 do
  346.           begin
  347.             y := mClone(z);
  348.             t := GetSystemTime;
  349.             case k of
  350.               0: ShellSort(y);
  351.               1: QuickSort2(y);
  352.               2: DivisionSort(y);
  353.               3: DivSort(y);
  354.               4: DivSortII(y);
  355.               5: DivideSort(y);
  356.               6: DivisionSortII(y);
  357.               7: DivideSortII(y);
  358.               8: ZoomSort(y);
  359.             end;
  360.             b := MD5(ToStr(y));
  361.             if (a <> b) then
  362.             begin
  363.               WriteLn(n[k], ' FAILED.');
  364.               TerminateScript;
  365.             end;
  366.             c := (c + ' ' + ToStr(GetSystemTime - t) + ' ms. [' + n[k] + ']');
  367.             SetLength(y, 0);
  368.           end;
  369.           WriteLn('REVERSED (', Length(x), '):' + c);
  370.         end;
  371.         2:
  372.         begin
  373.           z := mClone(x);
  374.           mRandomize(z);
  375.           c := '';
  376.           for k := 2 to 8 do
  377.           begin
  378.             y := mClone(z);
  379.             t := GetSystemTime;
  380.             case k of
  381.               0: ShellSort(y);
  382.               1: QuickSort2(y);
  383.               2: DivisionSort(y);
  384.               3: DivSort(y);
  385.               4: DivSortII(y);
  386.               5: DivideSort(y);
  387.               6: DivisionSortII(y);
  388.               7: DivideSortII(y);
  389.               8: ZoomSort(y);
  390.             end;
  391.             b := MD5(ToStr(y));
  392.             if (a <> b) then
  393.             begin
  394.               WriteLn(n[k], ' FAILED.');
  395.               TerminateScript;
  396.             end;
  397.             c := (c + ' ' + ToStr(GetSystemTime - t) + ' ms. [' + n[k] + ']');
  398.             SetLength(y, 0);
  399.           end;
  400.           WriteLn('SHUFFLED (', Length(x), '):' + c);
  401.         end;
  402.       end;
  403.     end;
  404.     WriteLn('');
  405.   end;
  406.   WriteLn('NO issues. :)');
  407. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement