归并排序模板

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
#define MAXI 2147483647
#define MAXL 9223372036854775807
#define eps (1e-8)
#define dg(i) cout << "*" << i << endl;
using namespace std;

int a[10];

/*L:数组左端下标,R:数组右端下标,M:中间位置下标
此函数整合两个数组为一个有序数组,这两个数组分别为{a[l],a[l+1],...,a[m]}
和{a[m+1],a[m+2],...,a[r]}.*/
void MergeArray(int L, int R, int M)
{
    vector<int> tmp;
    vector<int>::iterator it;
    int l = L, r = R, m = M + 1;
    //升序排列,故小的元素先压入临时数组
    //当L<M不成立时,数组{a[l],a[l+1],...,a[m]}已全部压入临时数组
    //当m<R不成立时,数组{a[m+1],a[m+2],...,a[r]}已全部压入临时数组
    while(l <= M && m <= R)
    {
        if(a[l] < a[m])
            tmp.push_back(a[l++]);
        else
            tmp.push_back(a[m++]);
    }
    //将剩余元素压入临时数组
    while(l <= M)
        tmp.push_back(a[l++]);
    while(m <= R)
        tmp.push_back(a[m++]);
    for(it = tmp.begin(); it != tmp.end(); it++)
        a[L++] = *it;
}

/*L:数组的左端下标,R:数组的右端下标
该函数通过递归将数组a不断二分,最终将a拆分为一个个数,每一个数当做一个数组;
在回溯时调用函数MergeArray(),从而将单元素数组(即数字)重新合并为有序数组*/
void MergeSort(int L, int R)
{
    int mid = (L + R) / 2; //数组中间位置的下标
    if(L < R)
    {
        /*以下两条语句将数组二分。
        先处理数组左半段,通过不断地执行语句1将数组左半段拆分为单个数字。
        在处理完左半段后,再执行语句2以处理数组右半段。第三条语句在二分
        完成后回溯时执行,作用是合并数字为新的有序数组*/
        MergeSort(L, mid); //语句1:处理数组左半段
        MergeSort(mid + 1, R); //语句2:数组右半段
        MergeArray(L, R, mid); //语句3:合并数字为新的有序数组
    }
}

int main()
{
    int i;
    for(i = 0; i < 10; i++) cin >> a[i];
    MergeSort(0, 9);
    for(i = 0; i < 10; i++) cout << a[i] << " ";
    cout << endl;
    return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值