描述:
代码如下:
public static void mergeSortAscend(int[] array, int low, int high) {
if (low < high) {
int mid = (low + high) / 2;
mergeSortAscend(array, low, mid);
mergeSortAscend(array, mid + 1, high);
mergeAscend(array, low, mid, high);
}
}
private static void mergeAscend(int[] array, int low, int mid, int high) {
int length1 = mid - low + 1;
int length2 = high - mid;
// 数组容量+1,用来在数组最后存放哨兵(哨兵可减少多余的判断)
int[] left = new int[length1 + 1];
int[] right = new int[length2 + 1];
int i;
int j;
for (i = 0; i < length1; i++) {
left[i] = array[low + i];
}
left[length1] = MAX_INFINITY;
for (j = 0; j < length2; j++) {
right[j] = array[mid + j + 1];
}
i = 0;
j = 0;
right[length2] = MAX_INFINITY;
// 合并两个数组
for (int k = low; k <= high; k++) {
if (left[i] > right[j]) {
array[k] = right[j];
j++;
} else {
array[k] = left[i];
i++;
}
}
}
算法分析:
递归式: T ( n ) = { Θ ( 1 ) , 若 n < = c a T ( n / b ) + D ( n ) + C ( n ) , 其 他 T(n)=\begin{cases} \Theta(1)\quad,若n<=c\\ aT(n/b)+D(n)+C(n)\quad,其他\end{cases} T(n)={Θ(1),若n<=caT(n/b)+D(n)+C(n),其他
分解:分解步骤需要计算子数组的中间位置,需要常量时间, D ( n ) = Θ ( 1 ) D(n)=\Theta(1) D(n)=Θ(1)
解决:递归求解两个规模均为n/2的子问题,需要 2 T ( n / 2 ) 2T(n/2) 2T(n/2)的运行时间
合并:一个具有n个元素的子数组上执行merge需要 Θ ( n ) \Theta(n) Θ(n)的时间,所以 C ( n ) = Θ ( n ) C(n)=\Theta(n) C(n)=Θ(n)
归并排序递归式: T ( n ) = { Θ ( 1 ) , 若 n < = c 2 T ( n / 2 ) + Θ ( n ) , 其 他 T(n)=\begin{cases} \Theta(1)\quad,若n<=c\\ 2T(n/2)+\Theta(n)\quad,其他\end{cases} T(n)={Θ(1),若n<=c2T(n/2)+Θ(n),其他
求解递归式:
主方法求解递归式: a = 2 , b = 2 , f ( n ) = n a=2,b=2,f(n)=n a=2,b=2,f(n)=n
∵ f ( n ) = Θ ( n log 2 2 ) \because f(n)=\Theta(n^{\log_22}) ∵f(n)=Θ(nlog22)
∴ T ( n ) = Θ ( n log 2 2 lg n ) = Θ ( n lg n ) \therefore T(n)=\Theta(n^{\log_22}\lg{n})=\Theta(n\lg{n}) ∴T(n)=Θ(nlog22lgn)=Θ(nlgn)
时间复杂度: Θ ( n lg n ) \Theta(n\lg{n}) Θ(nlgn)
空间复杂度: O ( n ) O(n) O(n)