1.归并排序
public static int[] sort(int[] arr,int left,int right){
int mid = left + (right - left)/2;
if(left < right){
sort(arr,left,mid);
sort(arr,mid + 1,right);
merge(arr,left,mid,right);
}
return arr;
}
public static void merge(int[] arr,int left,int mid,int right){
int i = left;
int j = mid+1;
int k = 0;
int[] temp = new int[right - left + 1];
while(i <= mid && j <= right){
if(arr[i] < arr[j]){
temp[k++] = arr[i++];
}else{
temp[k++] = arr[j++];
}
}
while(i <= mid){
temp[k++] = arr[i++];
}
while(j <= right){
temp[k++] = arr[j++];
}
for (int p= 0; p < temp.length; p++) {
arr[left + p] = temp[p];
}
}
时间复杂度 O(nlog n)
空间复杂度O(n)
2.堆排序
public static void sort(int []arr){
for (int i = arr.length/2 - 1; i >= 0; i--) {
adjustHeap(arr,i,arr.length);
}
for (int j = arr.length - 1; j > 0 ; j--) {
swap(arr,0,j);
adjustHeap(arr,0,j);
}
}
public static void adjustHeap(int []arr,int i,int length){
int temp = arr[i];
for (int k = 2*i+1; k < length; k=2*k+1) {
if(k+1<length && arr[k] < arr[k+1]){
k++;
}
if(arr[k] > temp){
arr[i] = arr[k];
i = k;
}else{
break;
}
}
arr[i] = temp;
}
时间复杂度 O(nlogn)
空间复杂度 O(1)