1. 程式人生 > >小白入門之歸併排序(Merge Sort)

小白入門之歸併排序(Merge Sort)

//首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第一個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另一個數列的資料依次取出即可。

 

//可以將A,B組各自再分成二組。依次類推,當分出來的小組只有一個數據時,可以認為這個小組組內已經達到了有序,然後再合併相鄰的二個小組就可以了。這樣通過先遞的分解數列,再合數列就完成了歸併排序。

 

 

 

#include <iostream>

using namespace std;

const int MAXN = 100;

 

void MergeSort(int a[], int l, int r);

void Merge(int a[], int l, int mid, int r);

 

int main()

{

    int a[MAXN]{10, 23, 45, 7, 6, 34, 78, 3, 2, 1};

    MergeSort(a, 0, 9);

    for(int i=0; i<9; i++)

    {

        cout << a[i] << " ";

    }

    return 0;

}

 

void MergeSort(int a[], int l, int r)

{

    if(l >= r)

    {

        return;

    }

 

    int mid = (l + r) / 2;

    MergeSort(a, l, mid);

    MergeSort(a, mid + 1, r);

    Merge(a, l, mid, r);

}

 

void Merge(int a[], int l, int mid, int r)

{

    int tmp[r - l + 1];

    for(int i=l; i<=r; i++)

    {

        tmp[i - l] = a[i];

    }

 

    int i = l, j = mid + 1;

    for(int k=l; k<=r; k++)

    {

        if(i > mid)                           //左半部分越界,將右方剩下的有序序列填入到陣列中

        {

            a[k] = tmp[j - l];

            j++;                               //移動

        }

        else if(j > r)                        //右半部分越界,將右方剩下的有序序列填入到陣列中

        {

            a[k] = tmp[i - l];

            i++;

        }

        else if(tmp[i - l] > tmp[j - l])      //左右部分依次逐個比較,將較小的元素放在原來陣列中

        {

            a[k] = tmp[j - l];

            j++;

        }

        else if(tmp[i - l] < tmp[j - l])

        {

            a[k] = tmp[i - l];

            i++;

        }

    }

}