算法思想:分治策略
时间复杂度:O(n·logn)
空间复杂度:O(n·logn) 非原地算法
1.函数主体
public static void mergeSort(double[] a,int l,int r){
if (l < r){
int m = (l + r) / 2;//把数组分成等长的左右两个
mergeSort(a, l, m);//递归左侧数组,使左侧数组有序
mergeSort(a, m+1, r);//递归右侧数组,使右侧数组有序
merge(a, l, m, r);//归并两个有序数组数组,得到一个完整的有序数组
}
}
2. merge函数(归并函数)
merge函数所要做的,就是把两个有序数组合并成一个有序数组。
public static void merge(double[] a, int l, int m, int r){
/*
* 1.将待归并的两个数组复制入新的数组中,因此,我们说归并排序不是原地排序
*/
double[] arr1 = new double[m - l + 2];
double[] arr2 = new double[r - m + 1];
for (int i = l ; i <= m ; i ++){
arr1[i - l] = a[i];
}
for (int i = m + 1 ; i <= r ; i ++){
arr2[i - m - 1] = a[i];
}
// 2.并令两个数组的最后一个元素是正无穷大。POSITIVE:正数,INFINITY:无穷大。
arr1[arr1.length-1] = Double.POSITIVE_INFINITY;
arr2[arr2.length-1] = Double.POSITIVE_INFINITY;
/*
* 3.将两个数组进行归并操作。即把两个有序数组合并成一个有序数组。
*/
int i = 0,j = 0;//ij分别记录两个数组正在操作的位置
for (int k = l ; k <= r ; k ++) {
if (arr1[i] < arr2[j]) {
a[k] = arr1[i];
i++;
} else {
a[k] = arr2[j];
j++;
}
}
}