【mergeSort】

来源:互联网 发布:自动随访系统 源码 编辑:程序博客网 时间:2024/05/16 15:57
详细解释: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函数
0 0