C++實現歸併排序(MergeSort)
阿新 • • 發佈:2020-04-26
本文例項為大家分享了C++實現歸併排序的具體程式碼,供大家參考,具體內容如下
一、思路:穩定排序
(1)劃分:一直呼叫劃分過程,直到子序列為空或只有一個元素為止,共需log2(n);
(2)歸併:將兩個子序列從小到大合併為一個序列
二、實現程式:
// 歸併排序:(二路歸併) // (1)遞迴分解陣列; // (2)合併有序的序列 #include <iostream> using namespace std; // 合併兩個有序的序列 template <typename T> void Merge(T arr[],int start,int mid,int end) { int i,j,k,n1,n2; k=0; n1 = mid - start + 1; n2 = end - mid; T *L = new T[n1],*R = new T[n2]; for(i = 0; i < n1; i++) // 將arr的左部分賦給L L[i] = arr[start+i]; for(j = 0; j < n2; j++) // 將arr的右部分賦給R R[j] = arr[mid+j+1]; i = 0; j = 0; k= start; while(i < n1 && j < n2) { // 合併 if(L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } while(i < n1) { // 左部分沒處理完 arr[k] = L[i]; k++; i++; } while(j < n2) { // 右部分沒處理完 arr[k] = R[j]; k++; j++; } delete []L; delete []R; } // 歸併排序 template <typename T> void MergeSort(T arr[],int end) { int mid; if(start >= end) return; mid = (start + end) / 2; MergeSort(arr,start,mid); MergeSort(arr,mid+1,end); Merge(arr,mid,end); } // 輸出陣列 template <typename T> void Print(T arr[],int n) { int i; for(i = 0; i < n; i++) cout << arr[i] << " "; cout << endl; } int main(int argc,const char * argv[]) { int n,i,arr[50]; cout << "請輸入要排序的數的個數:"; cin >> n; srand((int)time(NULL)); // 設定時間為隨機點 for(i = 0; i < n; i++) // 產生n個隨機數 arr[i] = rand() % 100; cout << "排序前:"; Print(arr,n); MergeSort(arr,n-1); // 呼叫歸併排序 cout << "排序後:"; Print(arr,n); return 0; }
測試結果:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。