1. 程式人生 > 其它 >二路歸併排序基本演算法

二路歸併排序基本演算法

2-Ways MergeSort

相當於每次處理兩個有序陣列的合併操作

/*
-------------------------------------------------
   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; }