归并排序算法

来源:互联网 发布:企业网络宣传语 编辑:程序博客网 时间:2024/06/16 18:16

数据结构课程中的归并排序算法介绍。

归并排序算法:

思想:首先,将a[o,1,2...n-1]看成是n个长度为1的有序表,将相邻的有序表成对归并,得到n/2个长度为2的有序表;然后,再将这些有序表成对归并,得到n/4个长度为4的有序表,如此反复进行下去,最后得到一个长度为n的有序表,这样排序结束。

算法:在实现归并排序时,通常是先实现一个将两个有序表归并为一个有序表的算法Merge(),然后对各趟进行归并,最终直到归并结束。

<span style="font-size:14px;">//二路归并void Merge(int a[],int low,int mid,int high){        int i=low,j=mid+1,k=0;        int b[high-low+1];        while(i<=mid&&j<=high)        {                if(a[i]<a[j])                {                        b[k]=a[i];                        i++;k++;                }                else                {                        b[k]=a[j];                        j++;k++;                }        }        while(i<=mid)        {                b[k]=a[i];                i++;k++;        }        while(j<=high)        {                b[k]=a[j];                j++;k++;        }        for(k=0,i=low;k<high-low+1;k++,i++)                a[i]=b[k];}//单趟处理void MergePass(int a[],int length,int n){        int i;        for(i=0;i+2*length-1<n;i=i+2*length)    //归并长度为length的偶数对                Merge(a,i,i+length-1,i+2*length-1);        if(i+length-1<n)                        //处理最后一个偶数对不为2*length时                Merge(a,i,i+length-1,n-1);                                                //奇数个length单位,最后一个轮空}//归并排序void MergeSort(int a[],int n){        int length;        for(length=1;length<n;length=2*length)                MergePass(a,length,n);}</span>

总结:归并算法产生的有序区不一定是全局有序的,相关性能如下:

 最后关于算法的测试:

/*归并排序算法*/#include <iostream>using namespace std;//二路归并void Merge(int a[],int low,int mid,int high){        int i=low,j=mid+1,k=0;        int b[high-low+1];        while(i<=mid&&j<=high)        {                if(a[i]<a[j])                {                        b[k]=a[i];                        i++;k++;                }                else                {                        b[k]=a[j];                        j++;k++;                }        }        while(i<=mid)        {                b[k]=a[i];                i++;k++;        }        while(j<=high)        {                b[k]=a[j];                j++;k++;        }        for(k=0,i=low;k<high-low+1;k++,i++)                a[i]=b[k];}//单趟处理void MergePass(int a[],int length,int n){        int i;        for(i=0;i+2*length-1<n;i=i+2*length)    //归并长度为length的偶数对                Merge(a,i,i+length-1,i+2*length-1);        if(i+length-1<n)                        //处理最后一个偶数对不为2*length时                Merge(a,i,i+length-1,n-1);                                                //奇数个length单位,最后一个轮空}//归并排序void MergeSort(int a[],int n){        int length;        for(length=1;length<n;length=2*length)                MergePass(a,length,n);}//测试函数int main(){        int a[10]={144,232,111,678,329,834,123,230,567,431};        cout<<"排序之前的数组元素为:";        for(int i=0;i<10;i++)                cout<<a[i]<<"  ";        cout<<endl;        MergeSort(a,10);        cout<<"排序之后的数组元素为:";        for(int i=0;i<10;i++)                cout<<a[i]<<"  ";        cout<<endl;}
测试结果:


0 0