c++用分治法對隨機陣列歸併排序
阿新 • • 發佈:2019-02-03
題目:隨機產生一個整型陣列,然後用合併排序將該陣列做升序排列,要求輸出排序前和排序後的陣列。
分析:
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 ; }