二路归并排序基本算法
相当于每次处理两个有序数组的合并操作
/* ------------------------------------------------- Author: wry date: 2022/3/1 16:36 Description: MergeSort ------------------------------------------------- */ #include <bits/stdc++.h> using namespace std; const int MAXN = 1000+10; int arr[MAXN]; int temp[MAXN]; //暂存数组 void Combine(int left,int middle,int right) { //传入时middle及其左边为有序,middle+1及其右边为有序 int i = left; int j = middle+1; int k = left; //定位暂存数组的位置,与arr处理的范围匹配,所以也从这次传入的left开始 //1.两边同时对比,选小的进入temp数组 while (i<=middle && j<=right) { if (arr[i]<=arr[j]) { temp[k] = arr[i]; i++; k++; } else if (arr[i]>arr[j]){ temp[k] = arr[j]; j++; k++; } } //2. 如果左边还有多余(右边没有了),则把左边的全部加入到数组后面 while (i<=middle) { temp[k] = arr[i]; i++; k++; } //3. 如果右边还有多余(左边没有了),则把右边的全部加入到数组后面 while (j<=right) { temp[k] = arr[j]; j++; k++; } //4. 将temp此范围内的数值全部传入覆盖arr for (int t=left;t<=right;t++) { arr[t] = temp[t]; } } void MergeSort(int left,int right) { if (left < right) { int middle = left + (right-left)/2; MergeSort(left,middle); MergeSort(middle+1,right); Combine(left,middle,right); } else { return ; } } int main() { int n; while (cin>>n) { for (int i=0;i<n;i++) { cin >> arr[i]; } MergeSort(0,n-1); for (int i=0;i<n;i++) { cout << arr[i] << " "; } } return 0; }