萌新第一次发帖求助,大家应该不会无视的吧
因为说我的实现方法要用到两个大数组,所以内存爆了,这个帖子求各位大佬的改进的方法
另外还有两个我尚不清楚的问题(已经标明在了注释里)各位如果有心可以帮忙研究下哇
不过归并排序确实不错,时间也比较稳定
//
// 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