Sort.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import java.util.Random;
  2. public class Sort {
  3. public static void main(String[] args) {
  4. System.out.println("Quick sort time testing");
  5. int[] a = generateRandomArray(20000000);
  6. quickSort(a);
  7. long time = System.currentTimeMillis();
  8. System.out.println("Second quick sort");
  9. quickSort(a);
  10. System.out.println("Time: " + (System.currentTimeMillis() - time));
  11. // Quick sort time testing
  12. // 804249086
  13. // Second quick sort
  14. // 689381057
  15. // Time: 669
  16. //
  17. // Much much fast with the pivot, first test, the second sort just didnt finish
  18. // System.out.println("Merge 20k");
  19. // int[] a = generateRandomArray(20000000);
  20. // long time = System.currentTimeMillis();
  21. // mergeSort(a);
  22. // System.out.println(
  23. // "Time: " + (System.currentTimeMillis() - time));
  24. // System.out.println("Merge 40k");
  25. // a = generateRandomArray(40000000);
  26. // time = System.currentTimeMillis();
  27. // mergeSort(a);
  28. // System.out.println(
  29. // "Time: " + (System.currentTimeMillis() - time));
  30. // System.out.println("Merge 80k");
  31. // a = generateRandomArray(80000000);
  32. // time = System.currentTimeMillis();
  33. // mergeSort(a);
  34. // System.out.println(
  35. // "Time: " + (System.currentTimeMillis() - time));
  36. // System.out.println("Quick 20k");
  37. // a = generateRandomArray(20000000);
  38. // time = System.currentTimeMillis();
  39. // quickSort(a);
  40. // System.out.println(
  41. // "Time: " + (System.currentTimeMillis() - time));
  42. // System.out.println("Quick 40k");
  43. // a = generateRandomArray(40000000);
  44. // time = System.currentTimeMillis();
  45. // quickSort(a);
  46. // System.out.println(
  47. // "Time: " + (System.currentTimeMillis() - time));
  48. // System.out.println("Quick 80k");
  49. // a = generateRandomArray(80000000);
  50. // time = System.currentTimeMillis();
  51. // quickSort(a);
  52. // System.out.println(
  53. // "Time: " + (System.currentTimeMillis() - time));
  54. // Merge 20k
  55. // 1665416280
  56. // Time: 2650
  57. // Merge 40k
  58. // 3470823619
  59. // Time: 5415
  60. // Merge 80k
  61. // 7221650896
  62. // Time: 11359
  63. // Quick 20k
  64. // 948351822
  65. // Time: 1838
  66. // Quick 40k
  67. // 2017226144
  68. // Time: 3788
  69. // Quick 80k
  70. // 4163682230
  71. // Time: 7875
  72. // Seems like quick is much faster
  73. }
  74. private static Random rand = new Random();
  75. static long comparisons;
  76. public static void quickSort(int[] a) {
  77. comparisons = 0;
  78. quickSort(a, 0, a.length - 1);
  79. System.out.println(comparisons);
  80. }
  81. private static void quickSort(int[] a, int start, int end) {
  82. if (start < end) {
  83. int pivot = partition(a, start, end);
  84. quickSort(a, start, pivot - 1);
  85. quickSort(a, pivot + 1, end);
  86. }
  87. }
  88. private static int partition(int[] a, int start, int end) {
  89. int mid = (start + end) / 2;
  90. int pivotIndex;
  91. if (
  92. (a[start] <= a[mid] && a[mid] <= a[end]) ||
  93. (a[end] <= a[mid] && a[mid] <= a[start])
  94. ) {
  95. pivotIndex = mid;
  96. } else if (
  97. (a[mid] <= a[start] && a[start] <= a[end]) ||
  98. (a[end] <= a[start] && a[start] <= a[mid])
  99. ) {
  100. pivotIndex = start;
  101. } else {
  102. pivotIndex = end;
  103. }
  104. swap(a, pivotIndex, end);
  105. int pivot = start - 1;
  106. for (int i = start; i <= end; i++) {
  107. comparisons++;
  108. if (a[i] <= a[end]) {
  109. comparisons++;
  110. swap(a, ++pivot, i);
  111. }
  112. }
  113. return pivot;
  114. }
  115. public static void mergeSort(int[] a) {
  116. comparisons = 0;
  117. mergeSort(a, 0, a.length - 1);
  118. System.out.println(comparisons);
  119. }
  120. private static void mergeSort(int[] a, int start, int end) {
  121. if (start < end) {
  122. int mid = (start + end) / 2;
  123. mergeSort(a, start, mid);
  124. mergeSort(a, mid + 1, end);
  125. merge(a, start, mid, end);
  126. }
  127. }
  128. public static void merge(int[] a, int start, int mid, int end) {
  129. int[] temp = new int[end - start + 1];
  130. int left = start;
  131. int right = mid + 1;
  132. int i = 0;
  133. while (left <= mid && right <= end) {
  134. comparisons += 2;
  135. if (a[left] < a[right]) {
  136. comparisons++;
  137. temp[i++] = a[left++];
  138. } else {
  139. temp[i++] = a[right++];
  140. }
  141. }
  142. while (left <= mid) {
  143. comparisons++;
  144. temp[i++] = a[left++];
  145. }
  146. while (right <= end) {
  147. comparisons++;
  148. temp[i++] = a[right++];
  149. }
  150. for (i = 0; i < temp.length; i++) {
  151. comparisons++;
  152. a[start++] = temp[i];
  153. }
  154. }
  155. public static void swap(int[] a, int x, int y) {
  156. int temp = a[x];
  157. a[x] = a[y];
  158. a[y] = temp;
  159. }
  160. public static int[] generateRandomArray(int length) {
  161. int[] a = new int[length];
  162. for (int i = 0; i < length; i++) a[i] = rand.nextInt(length * 10);
  163. return a;
  164. }
  165. public static boolean isSorted(int[] a) {
  166. for (int i = 1; i < a.length; i++) if (a[i - 1] > a[i]) return false;
  167. return true;
  168. }
  169. }