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