用荷兰国旗 改进的 快排
作者:互联网
速记快排 时间复杂度 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 }
标签:国旗,return,int,arr,快排,static,arr2,荷兰,public 来源: https://www.cnblogs.com/lihuazhu/p/10753172.html