排序算法(五):归并排序
程序员文章站
2022-05-10 17:22:26
...
归并排序
时间复杂度: O(NlogN)
空间复杂度: 对于数组来说, O(N)
稳定性: 稳定排序
/**
* 1.拆分
* 2.归并
*/
public class MergeSort {
public static void mergeSort(int arr[], int low, int high){
if(low < high){
// 拆分
int mid = (low + high) / 2;
// 左右两边子问题
mergeSort(arr, low, mid);
mergeSort(arr, mid + 1, high);
// 左右归并
merge(arr, low, mid, high);
}
}
/**
* 归并
* @param arr
* @param low
* @param mid
* @param high
*/
private static void merge(int[] arr, int low, int mid, int high) {
int[] pro = new int[high - low + 1]; // 辅助数组
int i = low;
int j = mid + 1;
int proIndex = 0;
// 将较小的数先移到新的数组中
while(i <= mid && j <= high){
if(arr[i] < arr[j]){
pro[proIndex++] = arr[i++];
}
else {
pro[proIndex++] = arr[j++];
}
}
// 将左边剩余的数移入数组
while(i <= mid){
pro[proIndex++] = arr[i++];
}
// 将右边剩余的数组移入数组
while(j <= high){
pro[proIndex++] = arr[j++];
}
// 将新数组中的数覆盖pro数组
for(int k = 0; k < proIndex; k++){
arr[k+low] = pro[k];
}
}
public static void main(String[] args) {
int arr[] = {1, 9, 2, 2, 4, 11, 23, 45, 6};
int high = arr.length - 1;
mergeSort(arr, 0, high);
for (int i:
arr) {
System.out.print(i + " ");
}
}
}