1. 程式人生 > 實用技巧 >正宗歸併排序演算法

正宗歸併排序演算法

正宗選擇排序演算法C++版本,看圖一目瞭然。

歸併排序和快速排序都用到了分治思想。這兩種排序演算法適合大規模的資料排序。

歸併排序的執行效率與要排序的陣列的有序程度無關,所以其時間複雜度是非常穩定的,不管最好、最壞、平均時間複雜度都是O(nlogn)。
空間複雜度是O(n)。

#include <iostream>
#include <vector>
#include <stack>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include "TreeNode.h"
using namespace std;

#define MAXSIZE 100000

// 合併
void Merge(int ans2[], int ans[], int start, int middle, int end){
    int j, k ,s;
    // 以此從小到大放入陣列ans
    for(j = middle + 1, k = start; start <= middle && j <= end; k++){
        if(ans2[start] < ans2[j])
            ans[k] = ans2[start++];
        else
            ans[k] = ans2[j++];
    }
    // 如果左邊陣列還有剩
    if(start <= middle)
        for(s = 0; s <= middle - start; s++)
            ans[k+s] = ans2[start + s];
    // 如果右邊陣列還有剩
    if(j <= end)
        for(s = 0; s <= end - j; s++)
            ans[k+s] = ans2[j + s];
}

void MSort(int num[], int ans[], int start, int end){
    int middle;
    if(start == end)
        ans[start] = num[start];
    else{
        int ans2[MAXSIZE + 1];
        middle = (start + end)/2;
        MSort(num, ans2, start, middle);
        MSort(num, ans2, middle + 1, end);
        Merge(ans2, ans, start, middle, end);
    }
}

int main(int argc, char* argv[]){
    int arr[8] = {8,7,6,5,4,3,2,1};
    MSort(arr, arr, 0, 7);
    for(int i = 0; i < 8; i++){
        cout<<arr[i]<<"\t";
    }
    return 0;
}