二路归并排序基本算法

相当于每次处理两个有序数组的合并操作

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

 

posted @ 2022-03-01 16:58  火星架构师  阅读(53)  评论(0编辑  收藏  举报