1. 问题
对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k
2. 解析
二分归并排序是典型的分治算法的应用。
不断将数组规模分解为原来的1/2,直至无法分解。
再不断升序归并,最终归并为一个升序数组。
3. 设计
void merge(int a[],int b[],int start,int middle,int end) {
for (int i = start; i <=end; i++)
{
b[i] = a[i];
}
int starta, startb, enda, endb,i=start;
starta = start;
enda = middle;
startb = middle + 1;
endb = end;
while (starta<=enda&&startb<=endb)
{
if (b[starta]<b[startb])
{
a[i++] = b[starta++];
}
else
{
a[i++] = b[startb++];
}
}
while (starta <= enda)
{
a[i++] = b[starta++];
}
while (startb <= endb)
{
a[i++] = b[startb++];
}
}
void mergeSort(int a[],int b[],int start,int end) {
int middle;
if (start<end)
{
middle = start + (end - start) / 2;
mergeSort(a,b,start, middle);
mergeSort(a,b,middle + 1, end);
merge(a,b,start, middle, end);
}
}
4. 分析
Merge算法比较次数:
最坏情况,比较n-1次
最好情况,比较n/2次
复杂度:
W(n)=2W(n/2)+n-1,n=2k
W(1)=0
W(n)=nlogn-n+1
时间复杂度为O(nlogn)
5. 源码
https://github.com/LonelyTaker/Algorithm-analysis