堆排序
class Solution { public int[] sortArray(int[] nums) { dumpSort(nums); return nums; } void dumpSort(int[] arr){ for (int i = arr.length/2-1; i >= 0; i--) { adjust(arr,i,arr.length); } for (int i = arr.length-1; i >= 0 ; i--) { swap(0,i,arr); adjust(arr,0,i); } } void adjust(int[] arr,int l,int len){ int temp = arr[l]; for (int i = l*2+1; i < len; i = i*2+1) { if (i+1 < len && arr[i] < arr[i+1]) i++; if (arr[i] > temp){ arr[l] = arr[i]; l = i; } } arr[l] = temp; } void swap(int a,int b,int[] arr){ int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; }}
快排
class Solution { Random rand = new Random(); public int[] sortArray(int[] nums) { quicklySort(0,nums.length-1,nums); return nums; } public void quicklySort(int l,int r,int[] arr){ if (l > r) return; int privot = l + rand.nextInt(r-l+1); swap(privot,r,arr); int idx = l-1; for (int i = l; i < r; i++) { if (arr[i] < arr[r]){ swap(++idx,i,arr); } } swap(++idx,r,arr); quicklySort(idx+1,r,arr); quicklySort(l,idx-1,arr); } void swap(int i,int j, int[] arr){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }}
最小k个数【快排变体】
class Solution { Random rand = new Random(); public int[] smallestK(int[] arr, int k) { if(arr.length <= k) return arr; quicklySort(0,arr.length-1,arr,k); return Arrays.copyOf(arr,k); } public void quicklySort(int l,int r,int[] arr,int k){ int privot = l + rand.nextInt(r-l+1); swap(privot,r,arr); int idx = l - 1; for (int i = l; i < r; i++) { if (arr[i] < arr[r]){ swap(++idx,i,arr); } } swap(++idx,r,arr); if(idx < k) quicklySort(idx+1, r, arr, k); else if(idx > k) quicklySort(l, idx-1, arr, k); } void swap(int i,int j, int[] arr){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }}
归并排序
class Solution { public int[] sortArray(int[] nums) { mergeSort(0,nums.length-1,nums); return nums; } void mergeSort(int l,int r,int[] arr){ if (l >= r) return; int mid = l + ((r - l)>>1); mergeSort(l,mid,arr); mergeSort(mid+1,r,arr); if(arr[mid] <= arr[mid+1]) return; merge(arr,l,mid+1,r,mid); } void merge(int[] arr,int l1,int l2,int r,int mid){ int[] temp = new int[r-l1+1]; int idx = 0; int begin = l1; while (l1 <= mid && l2 <= r){ temp[idx] = Math.min(arr[l1],arr[l2]); if (temp[idx] == arr[l1])l1++; else l2++; idx++; } System.arraycopy(arr,l1,temp,idx,mid-l1+1); // l1剩余 复制到temp后面 System.arraycopy(arr,l2,temp,idx,r-l2+1);// l2剩余 复制到temp后面 System.arraycopy(temp,0,arr,begin,r-begin+1); // temp 替换 arr }}