2756: C++習題-歸併排序

問題:

Description

有數列{6 58 14 2 19 354 684 4}
(1)申請一個數組q,準備存放合併後的序列
(2)將原序列拆分爲左序列{6 58 14 2}與右序列{19 354 68 4}
(3)將左右數組分別有序排列成{2 6 14 58}及{4 19 68 354} [這一過程通過遞歸重複(2)~(7)實現]
(4)設定i,j分別爲兩序列的初始位置
(5)比較i,j位置對應元素大小,選擇小的放入數組q,同時將i或j加1
(6)重複步驟(5)直到i或j中有一個達到序列尾
(7)最後將剩餘的元素複製到數組q中,兩子序列就合併爲一個有序序列了

注:本題只需提交部分代碼,輸入n(n<=100)及n個整數,輸出按從小到大順序排列好的數據

#include <iostream>
using namespace std;
void MergeSort(int p[],int s,int m,int t)
{
    int q[100];        //臨時數組q[100]用來存放排好的序列
    int i,j,k;            //i作爲左數組起始位置,j作爲右數組起始位置,k爲臨時數組位置
    for (i=s,j=m+1,k=0; k<=t-s; k++)
    {
        if (i==m+1)      //當i到達左數組的最後時,將右數組餘下元素複製到臨時數組中
        {
            q[k]=p[j];
            j++;
            continue;
        }
        if (j==t+1)        //當j達到右數組最後時,將左數組剩餘元素複製到臨時數組中
        {
            q[k]=p[i];

            i++;
            continue;
        }

///////////////////////////////////////////////////////////////////
        /*
         請在該部分填寫缺少的代碼
        */

////////////////////////////////////////////////////////////////////
    }
    for(i=s,j=0; i<=t; i++,j++) //將臨時數組的對應各項值賦給數組p[100]
        p[i]=q[j];

}
void Merge(int p[],int s,int t)
{
    if(s<t)
    {
        int m=(s+t)/2;
        Merge(p,s,m);           //遞歸對左數組進行歸併
        Merge(p,m+1,t);        //遞歸對左數組進行歸併
        MergeSort(p,s,m,t);   //合併數組
    }
}
int main()
{
    int n;//n爲輸入數據的個數
    int p[100];
    cin>>n;
    for(int i=0; i<n; i++)   //輸入n個數據
        cin>>p[i];
    Merge(p,0,n-1);        //調用函數進行歸併
    for(int i=0; i<n; i++)
        cout<<p[i]<<" ";        //輸出排列好的序列
    cout<<endl;
    return 0;

}

Input

n和n個整數

Output

從小到大排序

Sample Input

10
2 1 3 5 4 6 7 9 8 10

Sample Output

1 2 3 4 5 6 7 8 9 10 

HINT

Source

代碼:

#include <iostream>
using namespace std;
void MergeSort(int p[],int s,int m,int t)
{
    int q[100];        //臨時數組q[100]用來存放排好的序列
    int i,j,k;            //i作爲左數組起始位置,j作爲右數組起始位置,k爲臨時數組位置
    for (i=s,j=m+1,k=0; k<=t-s; k++)
    {
        if (i==m+1)      //當i到達左數組的最後時,將右數組餘下元素複製到臨時數組中
        {
            q[k]=p[j];
            j++;
            continue;
        }
        if (j==t+1)        //當j達到右數組最後時,將左數組剩餘元素複製到臨時數組中
        {
            q[k]=p[i];

            i++;
            continue;
        }
        if(p[i]<p[j])
        {
            q[k]=p[i];
            i++;
        }
        else
        {
            q[k]=p[j];
            j++;
        }
    }
    for(i=s,j=0; i<=t; i++,j++) //將臨時數組的對應各項值賦給數組p[100]
        p[i]=q[j];

}
void Merge(int p[],int s,int t)
{
    if(s<t)
    {
        int m=(s+t)/2;
        Merge(p,s,m);           //遞歸對左數組進行歸併
        Merge(p,m+1,t);        //遞歸對右數組進行歸併
        MergeSort(p,s,m,t);   //合併數組
    }
}
int main()
{
    int n;//n爲輸入數據的個數
    int p[100];
    cin>>n;
    for(int i=0; i<n; i++)   //輸入n個數據
        cin>>p[i];
    Merge(p,0,n-1);        //調用函數進行歸併
    for(int i=0; i<n; i++)
        cout<<p[i]<<" ";        //輸出排列好的序列
    cout<<endl;
    return 0;

}


附:歸併排序圖解(來自:歸併排序算法原理分析與代碼實現):


小結:學習了排序中的歸併排序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章