归并排序不小心MLE了,求解决方案
查看原帖
归并排序不小心MLE了,求解决方案
533130
夏凌汐楼主2024/7/11 01:06

萌新第一次发帖求助,大家应该不会无视的吧

因为说我的实现方法要用到两个大数组,所以内存爆了,这个帖子求各位大佬的改进的方法

另外还有两个我尚不清楚的问题(已经标明在了注释里)各位如果有心可以帮忙研究下哇

不过归并排序确实不错,时间也比较稳定

//
//  main.cpp
//  P1177
//
//  Created by 夏凌汐 on 2024/7/10.
//

#include <iostream>
#include <cstdio>
using namespace std;

int n;
int a[100005];
int b[100005];

void integrate(int l,int mid,int r){
    int i=0;                    //要注意l+i哇
    int j=1;
    for(int k=l;k<=r;k++){
        if(a[l+i]<a[mid+j]){
            b[k]=a[l+i];	//b数组是一个临时数组,用于接收合并的结果
            i++;
        }
        else{
            b[k]=a[mid+j];
            j++;
        }
        if(i>mid-l){
            i--;                //诶,小聪明!!!
            a[l+i]=2147483647;	//确保不会再从左端序列抽数
        }
        else if(j>r-mid){
            j--;
            a[mid+j]=2147483647;
        }
    }
    for(int k=l;k<=r;k++){
        a[k]=b[k];
    }
    return;
}

void ssort(int l,int r){
    if(l>=r){
        return;
    }
    else if(l+1==r){	//两个数时应当直接交换,不写的话会出问题,原因尚不清楚
        if(a[l]>a[r]){
            int t = a[l];
            a[l] = a[r];
            a[r] = t;
            return;
        }
    }
    int mid = (l + r)/2;
    ssort(mid,r);		//似乎必须先处理右端,否则程序不能终止,原因尚未清楚
    ssort(l,mid);
    integrate(l, mid, r);
    return;
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    ssort(1,n);//注意哈用sort的时候记得调整下标习惯,从1开始!!!
    for(int i=1;i<=n;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

那么拜请各位帮我研究一下orz

2024/7/11 01:06
加载中...