归并排序模板

来源:互联网 发布:淘宝联盟发单软件 编辑:程序博客网 时间:2024/06/08 06:15
#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;}


原创粉丝点击