问题
二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k
解析
以中间的数为基准,每次排序都将比它小的数放在前面,将比它大的数放在后面。
设计
void merge(int a[], int le, int mid, int ri) {
int i = le, j = mid + 1, k = le;
while (i != mid + 1 && j != ri + 1) {
if (a[i] >= a[j]) b[k++] = a[j++];
else b[k++] = a[i++];
}
while (i != mid + 1) b[k++] = a[i++];
while (j != ri + 1) b[k++] = a[j++];
for (i = le; i <= ri; i++) a[i] = b[i];
}
void mergesort(int a[], int le, int ri) {
int mid;
if (le < ri) {
mid = (le + ri) / 2;
mergesort(a, le, mid);
mergesort(a, mid + 1, ri);
merge(a, le, mid, ri);
}
}
分析
由伪代码设计可得,merge函数中最坏情况为n次,而mergesort函数中二分递归最坏情况为logn次,所以估计该算法时间复杂度为O(n*logn)。
推导:
可设在最坏情况下,该算法时间复杂度为W(n),则