归并排序
时间复杂度为:O(logn)
public void merge(int[] array,int left,int mid,int right){
int [] arr = new int [right-left+1];
int pos = 0; // 临时数组的位置
// 直接选择排序
int i = left;
int j = mid+1;
while(i<=mid && j<=right){
if(array[i] <= array[j]){
// 前面的小于后面的
arr[pos++] = array[i++];
}else{
// 后面的小于前面的
arr[pos++] = array[j++];
}
}
// 将剩余的全部加到临时数组后面
while(i<=mid){
arr[pos++] = array[i++];
}
while(j<=right){
arr[pos++] = array[j++];
}
// 用临时数组替换原数组
for(int n = left;n<=right;n++){
array[n] = arr[n-left];
}
}
// 归并排序
public void mergeSort(int left,int right, int [] array){
if(left >= right) return;
int mid = (left + right) / 2;
mergeSort(left,mid,array);
mergeSort(mid+1,right,array);
merge(array,left,mid,right);
}
ps : 各个排序算法的时间复杂度
算法 | 时间复杂度 | 最好 | 最坏 | 稳定性 | 空间 |
---|---|---|---|---|---|
插入排序 | O(n^2) | O(n) | O(n^2) | 稳定 | |
冒泡排序 | O(n^2) | O(n) | O(n^2) | 稳定 | |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | 稳定 | O(n) |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | 不稳定 | |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | 不稳定 |