归并排序--c++
/* 来自《算法分析与设计》 代码来自网络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); }
运行结果: