您的位置:首页 > 其它

【mergeSort】

2016-03-02 17:08 260 查看
详细解释:http://blog.csdn.net/yinjiabin/article/details/8265827

                                                                                       一张图诠释归并排序!!!
                                                                      


代码:

#include<iostream>
#include<stdlib.h>
using namespace std;
void mergeArray(int *a,int l,int mid,int r)
{
int i=l,j=mid+1,k=0;
int *p;
p=(int*)malloc((r-l+1)*sizeof(int));
while(i<=l&&j<=r){
if(a[i]<=a[j])
p[k++]=a[i++];
else
p[k++]=a[j++];//    在这里可以计算逆序数对的个数;
}
while(i<=mid)
p[k++]=a[i++];
while(j<=r)
p[k++]=a[j++];
j=0;
for(i=l;i<=r;i++)
a[i]=p[j++];
free(p);
}
void mergeSort(int *a,int l,int r)
{
if(l<r){
int mid=(l+r)>>1;
mergeSort(a,l,mid);
mergeSort(a,mid+1,r);
mergeArray(a,l,mid,r);
}
}
int main()
{
int a[]={9,8,7,6,5,4,3,2,1,0};
mergeSort(a,0,sizeof(a)/sizeof(a[0]));
for(int i=0;i<10;i++)
cout<<a[i]<<' ';
return 0;
}


总结:

1. 归并排序的时间复杂度为O(nlgn), 空间复杂度为O(n)

2. 归并排序属于稳定排序,即排序前后相等元素的先后顺序不变,这是在O(nlgn)系列算法中(比如快速排序)少有的稳定排序算法

3. 在计算mid = (low + high) / 2时,如果low和high很大,则可能发生溢出,可将式子转换为mid = low + (high - low) / 2

4. 书上伪代码是在每次merge时分配临时空间,这样多次分配释放会影响效率,可以预先分配O(n)的空间作为参数传给merge函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: