歸並排序(C++版)


  實現自《算法導論》上的歸並排序。

  寫這個算法花了比較長的時間,一直在擼Java,好久不摸C++,再次用起C++倍感親切。寫這個算法很簡單,原理也很簡單,但是陷阱在與這個算法中對數組的使用,下標的訪問和控制。一般歸並排序都是用1作下標,但是今天作死想用0作下標。恩~一直沒有轉過腦筋來,但是最終還是實現了。

  源代碼如下:

#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
const int N = 204800;

void Merge(int arr[], int p, int q, int r){
    int n1 = q - p + 1;
    int n2 = r - q + 1;
    int left[n1 + 1], right[n2];

    for (int i = 0; i != n1; ++i){
        left[i] = arr[p + i];
    }
    left[n1] = N;

    for (int j = 0; j != n2 - 1; ++j){
        right[j] = arr[q + j + 1];
    }
    right[n2 - 1] = N;

    int i = 0, j = 0;
    for(int k = p; k != r + 1; ++k){
        if(left[i] > right[j]){
            arr[k] = right[j];
            ++j;
        }
        else{
            arr[k] = left[i];
            ++i;
        }
    }
}

void MergeSort(int arr[], int p, int r){
    if(p < r){
        int q = (p + r)/2;
        MergeSort(arr, p, q);
        MergeSort(arr, q + 1, r);
        Merge(arr, p, q, r);
    }
}

int main(){
    int arr[10] = {300, 60, 22, 16, 85, 89, 30, 99, 103, 55};
    MergeSort(arr, 0, 9);
    for(int i = 0; i < 10; ++i){
        cout<<arr[i]<<endl;
    }
    return 0;
}

    開始的ctime本來打算用時間做種子出隨機數。但是這個隨機數和正態分布略符合,棄之。隨機數部分代碼如下:

    srand(time(NULL));
    int arr[rand()%100];
    for (int i = 0; i != sizeof(arr)/sizeof(int); ++i){
        arr[i] = rand()%500;
    }
    for (int i = 0; i != sizeof(arr)/sizeof(int); ++i){
        cout<<arr[i]<<"   ";
        if((i + 1) % 10 == 0)
            cout<<endl;
    }
    cout<<"end"<<endl;
    MergeSort(arr, 0, sizeof(arr)/sizeof(int));
    for (int i = 0; i != sizeof(arr)/sizeof(int); ++i){
        cout<<arr[i]<<"   ";
        if((i + 1) % 10 == 0)
            cout<<endl;
    }

                                                  聯系方式:18829213810@126.com


免責聲明!

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



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