速记快排 时间复杂度  O(N * logN)  额外空间 O(logN)

 

  1. 1 package my_basic;
  2. 2
  3. 3 import java.util.Arrays;
  4. 4
  5. 5 import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;
  6. 6
  7. 7 /**
  8. 8 * 用荷兰国旗改进快排
  9. 9 */
  10. 10 public class QuickSort {
  11. 11 public static void quickSort(int[] arr) {
  12. 12 if (arr == null || arr.length < 2) {
  13. 13 return;
  14. 14 }
  15. 15 quicksort(arr, 0, arr.length-1);
  16. 16 }
  17. 17
  18. 18 public static void quicksort (int[] arr,int l,int r) {
  19. 19 if (l < r) {
  20. 20
  21. 21 swap(arr, l + (int) (Math.random() * (r - l + 1)), r); //随机快排
  22. 22 int[] p = partition(arr, l, r);
  23. 23 quicksort(arr, l, p[0]-1); //经典快排每次只搞定一个 这里做了优化
  24. 24 quicksort(arr, p[1]+1, r);
  25. 25
  26. 26 }
  27. 27
  28. 28 }
  29. 29
  30. 30 public static int[] partition(int[] arr, int l, int r) {
  31. 31
  32. 32 int less= l-1;
  33. 33 int more = r;
  34. 34 while (l < more) {
  35. 35 if (arr[l] < arr[r]) {
  36. 36 swap(arr, ++less, l++);
  37. 37 }else if (arr[l]>arr[r]) {
  38. 38 swap(arr,--more,l);
  39. 39 }else {
  40. 40 l++;
  41. 41 }
  42. 42 }
  43. 43 swap(arr, more, r);
  44. 44
  45. 45 return new int[] {less + 1 , more }; // =num 的左右边界
  46. 46 }
  47. 47 public static void swap(int[] arr, int i, int j) {
  48. 48
  49. 49 int tmp = arr[i];
  50. 50 arr[i]=arr[j];
  51. 51 arr[j]=tmp;
  52. 52 }
  53. 53
  54. 54 //对数器
  55. 55 public static int[] generateRandomArray(int maxSize,int maxValue) {
  56. 56 int[] arr = new int[(int) ((maxSize+1)*Math.random())];
  57. 57 for (int i = 0; i < arr.length; i++) {
  58. 58 // arr[i] = (int) ((maxValue+1)* Math.random() - (int)(maxValue*Math.random()));
  59. 59 arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
  60. 60 }
  61. 61 return arr;
  62. 62 }
  63. 63 public static void printArray(int[] arr) {
  64. 64 if (arr == null) {
  65. 65 return;
  66. 66 }
  67. 67 for (int i = 0; i < arr.length; i++) {
  68. 68 System.out.print(arr[i]+" ");
  69. 69 }
  70. 70 System.out.println();
  71. 71 }
  72. 72 public static int[] copyArray(int[] arr) {
  73. 73 if (arr == null) {
  74. 74 return null;
  75. 75 }
  76. 76 int[] res = new int[arr.length];
  77. 77 for (int i = 0; i < arr.length; i++) {
  78. 78 res[i] = arr[i];
  79. 79 }
  80. 80 return res;
  81. 81 }
  82. 82
  83. 83
  84. 84 public static void comparator(int[] arr) {
  85. 85 Arrays.sort(arr);
  86. 86 }
  87. 87 public static boolean isEqual(int[] arr1, int[] arr2) {
  88. 88 if ((arr1==null && arr2!=null) || (arr1!=null && arr2==null) ) {
  89. 89 return false;
  90. 90 }
  91. 91 if (arr1.length != arr2.length) {
  92. 92 return false;
  93. 93 }
  94. 94 for (int i = 0; i < arr2.length; i++) {
  95. 95 if (arr1[i] != arr2[i]) {
  96. 96 return false;
  97. 97 }
  98. 98 }
  99. 99 return true;
  100. 100 }
  101. 101
  102. 102 public static void main(String[] args) {
  103. 103 int testTime = 500000;
  104. 104 int maxSize = 6;
  105. 105 int maxValue = 100;
  106. 106 boolean succeed = true;
  107. 107 for (int i = 0; i < testTime; i++) {
  108. 108 int[] arr1 = generateRandomArray(maxSize, maxValue);
  109. 109 int[] arr2 = copyArray(arr1);
  110. 110 quickSort(arr1);
  111. 111 comparator(arr2);
  112. 112 if (!isEqual(arr1, arr2)) {
  113. 113 succeed = false;
  114. 114 printArray(arr1);
  115. 115 printArray(arr2);
  116. 116 break;
  117. 117 }
  118. 118 }
  119. 119 System.out.println(succeed ? "Nice!" : "Fucking fucked!");
  120. 120 }
  121. 121 }

 

版权声明:本文为lihuazhu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lihuazhu/p/10753172.html