堆排序
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
}
}