C++ 實現MergeSort算法


算法思想:

假設有兩個人,每人手里都有一部分牌,而且每個人手中的牌都按大小順序排列好了。
那么,現在要把兩個人手中的牌合並到一起,並且合並后要從小到大依次排好,可以這樣做:
每個人都從手中拿出最小的牌,然后比較,誰的牌小就把該張牌放在桌面上,牌大的一方牌仍然拿在手中,待下次再比較。
下一次每個人又拿最小的牌進行比較,如此下去。。。直到一方手中的牌全部放在了桌面上,這時另一方就可以把牌按從小到大的順序全部放在桌面上了。
這時,桌面上的牌顯然是排好了序的。
這就是歸並排序法的主要思想。當然,有歸並,首先就得分割,得把手中的牌分到兩個人手中,然后分到四個人手中。。。
一直分到每人手中只有一張牌。然后才可以每兩個人進行合並,最后合並到一個人的手中。

c++實現:

#include <iostream>
using namespace std;

#define N 100

int g_array[N];     //存放輸入的數字
static int count;   //存放元素的個數

// 初始化函數
void Initial()
{
    cout << "請輸入元素的個數:";
    cin >> count;
    cout << "請輸入" << count << "個元素:";
    for(int i = 0; i < count; i ++)
    {
        cin >> g_array[i];
    }
}

//合並函數
void Merge(int a[], int l, int m, int r)
{
    int i = l, j = m+1, k = l;
    int b[N];
    while(i <= m && j <= r)
    {
        if(a[i] <= a[j])
        {
            b[k++] = a[i++];
        }
        else
        {
            b[k++] = a[j++];
        }
    }

    if(i > m)
    {
        for(int p = j; p <= r; p ++)
        {
            b[k++] = a[p];
        }
    }
    else
    {
        for(int p = i; p <= m; p ++)
        {
            b[k++] = a[p];
        }
    }

    //把b[]中排好的元素copy到a[]中
    for(int q = l; q <= r; q ++)
    {
        a[q] = b[q];
    }
}

//  歸並排序 遞歸算法表示
void MergeSort(int a[], int left, int right)
{
    if(left < right)    //數組至少要有兩個元素
    {
        int i = (right + left)/2;
        MergeSort(a, left, i);
        MergeSort(a, i+1, right);
        Merge(a, left, i, right); //把left到right的元素排序好
    }
}

//打印排好序的數組
void Print()
{
    cout << "經過MergeSort后:";
    for(int i = 0; i < count; i ++)
    {
        cout << g_array[i] << " ";
    }
    cout << endl;
}

int main()
{
    Initial();
    if(count > 1)
    {
        MergeSort(g_array, 0, count-1);
        Print();
    }
    else if(count == 1)
    {
        Print();
    }
    system("pause");
    return 0;
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM