1.问题
对n个不同的数构成的数组A[1…n]进行二分归并排序,其中n=2^k
2.解析
3.设计
void Merge(int A[], int l, int r)
{
int mid = (l + r) / 2;
int i = l, j = mid + 1;
int tmp[9] = { 0 }, cnt = 0;
while (i <= mid && j <= r)
{
if (A[i] < A[j])
tmp[++cnt] = A[i++];
else
tmp[++cnt] = A[j++];
}
while (i <= mid)tmp[++cnt] = A[i++];
while (j <= r)tmp[++cnt] = A[j++];
cnt = 0;
while (l <= r)A[l++] = tmp[++cnt];
}
void MergeSort(int A[], int l, int r)
{
if (l == r)return;
int mid = (l + r) / 2;
MergeSort(A, l, mid);
MergeSort(A, mid + 1, r);
Merge(A, l, r);
}
4.分析
二分合并排序将序列不断二分,每次二分后通过Merge进行合并,直到二分后的序列仅剩1个元素。
Merge的时间复杂度是最坏为n-1,如1,3,5和2,4,6;最好则是n/2,如1,2,3和4,5,6
所以可以推出二分合并排序的时间复杂度为W(n)=2W(n/2)+n-1,当n=1,W(1)=0.
根据主定理可以猜测复杂度与nlogn为同一量级。
5.源码
添加链接描述