【模板】 归并排序

递归版本:(空间贼大)

//Menteur_Hxy
#include <cstdio>
#include <iostream>
#include <algorithm>
#define ll long long
#define f(a,b,c) for(register int a=(b);a<=(c);a++)
using namespace std;

inline ll rd() {
    ll x=0,fla=1; char c=' ';
    while(c<'0' || c>'9') {c=getchar();if(c=='-') fla=-fla;}
    while(c>='0' && c<='9') x=x*10+c-'0',c=getchar();
    return x*fla;
}

inline void out(ll x){
    int a[25],wei=0;
    if(x<0) putchar('-'),x=-x;
    for(;x;x/=10) a[++wei]=x%10;
    if(wei==0){ puts("0"); return;}
    for(int j=wei;j>=1;--j) putchar('0'+a[j]);
    putchar(' ');
}

const int MAX=10010;
int n;
int a[MAX];

void merge(int *num,int *a,int l,int r) {
    int i=l,j,k=l,m=(l+r)>>1;
    for(j=m+1;i<=m && j<=r;k++) 
        if(num[i]<=num[j]) a[k]=num[i++];
        else a[k]=num[j++];
    while(i<=m) a[k++]=num[i++];
    while(j<=r)   a[k++]=num[j++];
}

void mergesort(int *num,int *a,int l,int r) {
    if(l==r) a[l]=num[l];
    else {
        int t[MAX],mid=(l+r)>>1;
        mergesort(num,t,l,mid);
        mergesort(num,t,mid+1,r);
        merge(t,a,l,r);
    }
}

int main() {
    n=rd();
    f(i,1,n) a[i]=rd();
    mergesort(a,a,1,n);
    f(i,1,n) out(a[i]);
    return 0;
}

迭代版本:(比较正常)

//Menteur_Hxy
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cstdlib>
#define ll long long
#define f(a,b,c) for(register int a=(b);a<=(c);a++)
using namespace std;

inline ll rd() {
    ll x=0,fla=1; char c=' ';
    while(c<'0' || c>'9') {c=getchar();if(c=='-') fla=-fla;}
    while(c>='0' && c<='9') x=x*10+c-'0',c=getchar();
    return x*fla;
}

inline void out(ll x){
    int a[25],wei=0;
    if(x<0) putchar('-'),x=-x;
    for(;x;x/=10) a[++wei]=x%10;
    if(wei==0){ puts("0"); return;}
    for(int j=wei;j>=1;--j) putchar('0'+a[j]);
    putchar(' ');
}

const int MAX=100010;
int n;
int a[MAX],temp[MAX];

void mergesort(int *num,int l,int r) {
    int k=0,lmi,rmi,lma,rma;
    for(int i=1;i<=r-l;i*=2) {
        for(lmi=l; lmi<=r-i; lmi=rma+1) {
            lma=lmi+i-1,rmi=lma+1,rma=min(r,rmi+i-1);
            // out(lmi),out(lma),out(rmi),out(rma);putchar('\n');
            while(lmi<=lma && rmi<=rma) 
                if(num[lmi] < num[rmi]) temp[k++]=num[lmi++];
                else temp[k++]=num[rmi++];
                // out(lmi),out(lma),out(rmi),out(rma);putchar('\n');
            while(lmi <= lma) num[--rmi]=num[lma--];
            while(k) num[--rmi]=temp[--k];
                // ,out(temp[k]);
            // putchar('\n');
            // for(int i=1;i<=n;i++) cout<<num[i]<<" ";
            // putchar('\n');
        } 
    }
}

int main() {
    n=rd();
    f(i,1,n) a[i]=rd();
    mergesort(a,1,n);
    f(i,1,n) out(a[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ye_xingyu/article/details/80173651