算法分析与设计实践作业4
1. 问题
二分归并排序:对n个不同的数构成的数组A[1..n]进行排序,其中n=2^k
2. 解析
二分归并排序采用分治法的思想,将数组先划分再排序。先把这个要排序的数组划分为两份,然后再把子数组再次二分,直到数组的大小为1;然后从最底端开始向上合并,合并的过程对每一个子数组进行排序。下面以数组{50,61,49,38,53,65,10,36}为例:
3. 设计
void MergeSort(first,last){//划分
int middle;
if(first<last){
middle=(first+last)/2;
MergeSort(first,middle);
MergeSort(middle+1,last);
Merge(first,middle,last);
}
}
Merge(first,middle,last){
int i=first;
int j=middle+1;
int p=first;
while(i<=middle && j<=last){
if(a[i]>a[j])
newA[p++]=a[j++];
else
newA[p++]=a[i++];
}
while(i!=middle+1)
newA[p++]=a[i++];
while(j!=last+1)
newA[p++]=a[j++];
for(int b=first;b<=last;b++)
a[b]=newA[b];
}
4. 分析
算法复杂度:O(nlog2(n))
5. 源码
github地址:https://github.com/122cmy/myGitTemp4
博客地址:https://www.cnblogs.com/122cmy/