归并排序算法

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

归并排序算法:

思想:首先,将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;

}
测试结果:


你可能感兴趣的:(归并排序)