實現自《算法導論》上的歸並排序。
寫這個算法花了比較長的時間,一直在擼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