1. 程式人生 > >c++用分治法對隨機陣列歸併排序

c++用分治法對隨機陣列歸併排序

題目:隨機產生一個整型陣列,然後用合併排序將該陣列做升序排列,要求輸出排序前和排序後的陣列。

分析:

1、需要隨機產生一個整數陣列;

2、採用的演算法是合併排序,也就是用歸併排序;

3、輸出排序後的陣列。

歸併排序:先把已知陣列分成兩組,然後兩組中分別再分成兩組,直到每一組都只有一個數據,然後再合併的同時排序,直到都合併起來就ok。需要寫出兩個函式:

  MergeSort() —>歸併函式,用遞迴的方式把資料細分,最後合併。

  Merge() —>合併函式。

隨機產生一個整數陣列:這個問題首先想到的是用rand()函式(c語言和c++我記得好像不太一樣,c++是用rand()函式),rand()函式不需要引數,是來返回一個從0到最大隨機數的任意整數,最大隨機數的大小通常是固定的一個大整數。


最後程式碼如下:

#include "iostream"
#include "time.h"
#include "stdlib.h"
using namespace std;
//合併函式
void Merge(int *_Array, int p, int q, int r) {// p:第0個;r:第n-1個數,q:第(r + p) / 2個數
    int len1 = q - p + 1;
    int len2 = r - q;
    int *L = new int[len1 + 1];//用動態陣列儲存左邊的數
    int *R = new int[len2 + 1];//用動態陣列儲存右邊的數

    for (int i = 0; i < len1; i++) {// 把Array陣列左邊的數放入L陣列
        L[i] = _Array[p + i];
    }

    for (int j = 0; j < len2; j++) {// 把Array陣列右邊的數放入R陣列
        R[j] = _Array[q + 1 + j];
    }
    int i = 0, j = 0;
    for (int k = p; k <= r; k++) {
        if (L[i] < R[j]) {//小的放左邊,大的放右邊
            _Array[k] = L[i];
            i++;
        }
        else {
            _Array[k] = R[j];
            j++;
        }
    }
}
//  歸併排序
void MergeSort(int _Array[], int p, int r) {
    if (p < r) {//p:第0個;r:第n-1個數。陣列至少要有兩個資料
        int q;
        q = (r + p) / 2;//拆分兩組
        MergeSort(_Array , p , q);//拆分第0個到第 (r + p) / 2個 ,即拆分左半部分
        MergeSort(_Array , q+1 , r);//拆分第(r + p) / 2個到第r個 ,即拆分右半部分
        Merge(_Array , p , q , r);//呼叫合併函式,從第0個到第n-1個排好
    }
}

int main() {
    int n;
    cout << "輸入產生的陣列個數:";
    cin >> n;
    cout << endl;
    int *Array = new int[n];
    cout << "產生的隨機陣列為:";
    srand((unsigned)time(0));

    for (int i = 0; i < n; i++) {
        Array[i] =  (rand()%(100-0+1))+0;
        //cin>>;
        cout<<Array[i]<<"  ";
    }
    cout<<endl;

    MergeSort(Array,0,n-1);

    cout << "排序後的陣列為:";
    for(int j  = 0;j<n;j++){
        cout<<Array[j]<<"  ";
    }
//    int a;
//    cin>>a;
    return 0 ;
}
執行示例: