/* 來自《算法分析與設計》 代碼來自網絡https://blog.csdn.net/m0_38068229/article/details/81262282*/ /* 輸入:數組A[1...m]和它的三個索引p,q,r,1<=p<=q<r<=m,兩個子數組A[p...q]和A[q+1...r]各自按升序排列 輸出:合併兩個子數組A[p...q]和A[q+1...r]的數組A[p...r] comment:B[p...r]是個輔助數組 s <- p; t <- q+1; k <- p; while s <= q and t <= r if A[s] <= A[t] then B[k] <- A[s] s <- s+1 else B[k] <- A[t] t <- t+1 end if k <- k+1 end while if s = q+1 then B[k...r] <- A[t...r] else B[k...r] <- A[s...q] end if A[p...r] <- B[p...r] */
#include<iostream> using namespace std; //歸併過程 void merge(int arr[], int l, int mid, int r); //遞歸 static void mergeSort(int arr[], int l, int r); //歸併排序整個數組 void mergeSort(int arr[], int n); int main() { int n; while(cin >> n) { int arr[n]; for(int i = 0; i < n; i++) cin >> arr[i]; mergeSort(arr, n); cout << "After sorted:" << endl; for(int i = 0; i < n; i++) cout << arr[i] << " "; cout << endl; } return 0; } //歸併 void merge(int arr[], int l, int mid, int r) { int help[r-l+1]; //輔助數組 int i = 0; int lIndex = l; int rIndex = mid+1; while(lIndex <= mid && rIndex <= r) { help[i++] = arr[lIndex] < arr[rIndex] ? arr[lIndex++]:arr[rIndex++]; } //左邊或右邊有一邊到頭了,不可能同時到,由於每次只移動一邊。 while(lIndex <= mid) { help[i++] = arr[lIndex++]; } while(rIndex <= r) { help[i++] = arr[rIndex++]; } //將排好序的輔助數組複製給原始數組,不須要返回值 for(i = 0; i < r-l+1; i++) { arr[l+i] = help[i]; } } //遞歸 static void mergeSort(int arr[], int l, int r) { if(l == r) return; int mid = (l+r)/2; //左半部分歸併排序 mergeSort(arr, l, mid); //右半部分歸併排序 mergeSort(arr, mid+1, r); //左右部分歸併 merge(arr, l, mid, r); } //歸併排序整個數組 void mergeSort(int arr[], int n) { //若是數組爲空或只有一個元素,不須要排序 if(arr == NULL || n < 2) return; mergeSort(arr, 0, n-1); }
運行結果:ios