歸併排序

1、概念

歸併排序(Merging Sort):將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分爲若干個子序列,每個子序列是有序的。然後再把有序子序列合併爲整體有序序列。

2、算法實現

第一步:申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列;

第二步:設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置;

第三步:比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置;

重複步驟3直到某一指針達到序列尾

將另一序列剩下的所有元素直接複製到合併序列尾

3、code

/*將SR[s…t]歸併排序爲TR1[s…t]*/
void MSort(int SR[],TR1[],int s,int t)
{
    int m;
    int TR2[MAXSIZE+1];
    if(s==t)
        TR1[s]=SR[s];
    else
    {
        m=(s+t)/2;    /*將SR[s…m]和SR[m+1…t]*/
        MSort(SR,TR2,s,m);
        MSort(SR,TR2,m+1,t);
        Merge(TR2,TR1,s,m,t);    /*將TR2[s…m]和TR2[m+1…t]歸併到TR1[s…t]*/
    }
}

/*將有序的SR[i…m]和SR[m+1…n]歸併爲有序的TR[i…n]*/
void Merge(int SR[],int TR[],int i,int m,int n)
{
    int j,k,l;
    for(j=m+1,k=i;i<=m&&j<=n;k++)    /*將SR中記錄由小到大歸併入TR*/
    {
        if(SR[i]<SR[j])
            TR[k]=SR[i++];
        else
            TR[k]=SR[j++];
    }
    if(i<=m)    /*說明SR[i…m]沒有完全歸併到TR而SR[m+1…n]已經全部歸併到SR*/
    {
        for(l=0;l<=m-i;l++)
            TR[k+1]=SR[i+1];    /*將剩餘的SR[i…m]複製到TR*/
    }
    if(j<=n)    /*說明SR[m+1…n]沒有完全歸併到TR而SR[i…m]已經全部歸併到SR*/
    {
        for(l=0;l<=n-j;l++)
            TR[k+1]=SR[j+1];    /*將剩餘的SR[m+1…n]複製到TR*/
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章