歸併排序

分治法的思想:將原問題分解爲幾個規模較小但相似於原問題的子問題,遞歸求解這些子問題,而後再合併這些子問題的解來創建原問題的解。主要包括三個主要步驟:一、分解原問題 ;二、解決子問題;三、合併子問題的解ios

歸併排序遵循分治模式,算法的時間複雜度是O(NlogN),屬於穩定排序。直觀操做爲:算法

分解:分解待排序的n個元素的序列成各具備n/2個元素的兩個子序列。數組

解決:使用歸併排序遞歸地排序兩個子序列。ide

合併:合併兩個已排序的子序列以產生已排序的答案。函數

具體算法由一個輔助函數和一個遞歸函數組成:測試

函數代碼:spa

#include<iostream>
using namespace std;
#define INF 65535

template<class T>
void Merge(T *A, int p, int q, int r)
{
    int n1 = q - p + 1;
    int n2 = r - q;
    T *L = new T[n1 + 1];
    T *R = new T[n2 + 1];
    for (int i = 0; i<n1; i++){
        L[i] = A[p + i];
    }
    for (int j = 0; j<n2; j++){
        R[j] = A[q + j + 1];
    }
    L[n1] = INF;
    R[n2] = INF;
    int i = 0,j = 0;
    for (int k = p; k <= r; k++)
    {
        if (L[i] <= R[j])
        {
            A[k] = L[i];
            i++;
        }
        else{
            A[k] = R[j];
            j++;
        }
    }

    delete[]L;
    delete[]R;
}

//二分歸併排序
template<class T>
void MergeSort1(T *A, int p, int r)             // p r 均是元素下標
{
    if (p<r)
    {
        int q = (p + r) / 2;
        MergeSort1(A, p, q);         
        MergeSort1(A, q + 1, r);
        Merge(A, p, q, r);
    }
}

測試代碼:code

int main()
{
    int arry[] = { 210, 12, 9, 1, 5, 8, 19, 4, 7, 10,15,17,21,41,51,61,81,71,91,100 };
    MergeSort1<int>(arry, 0, 19);        //調用時,是數組首元素和末尾元素下標
    for (int i = 0; i < 20; i++)
        cout << arry[i] << " ";
    cout << endl;    
    cout << "BigThink" << endl;
    system("pause");
    return 0;
}
View Code
相關文章
相關標籤/搜索