Pao_Pao_ @ 2024-06-18 11:50:31
#include<iostream>
#include<cstdio>
#define N 5000000
using namespace std;
int num[N+10],k;
int qsort(int l,int r){
if(l == r){
return num[l];
}
int i = l,j = r,temp,flag;
flag = num[(l+r)/2];
do{
while(num[i]<flag) i++;
while(num[j]>flag) j--;
if(i<=j){
temp = num[i];
num[i] = num[j];
num[j] = temp;
i++;
j--;
}
}while(i<=j);
if(k<=j){
qsort(l,j);
}else if(k>=i){
qsort(i,r);
}else{
return num[i-1];
}
}
int main() {
int n;
scanf("%d%d",&n,&k);
for(int i = 0; i<n; i++) {
scanf("%d",&num[i]);
}
cout<<qsort(0,n-1);
return 0;
}
代码如上,我使用的分治,在找到k之后排序函数返回值,在主函数中输出,测试点3个RE,2个MLE。 在修改为在排序函数中直接输出之后则AC。请问是因为递归调用的原因吗?想知道具体问题。 排序函数修改后代码:
void qsort(int l,int r){
if(l == r){
cout<<num[l];
return;
}
int i = l,j = r,temp,flag;
flag = num[(l+r)/2];
do{
while(num[i]<flag) i++;
while(num[j]>flag) j--;
if(i<=j){
temp = num[i];
num[i] = num[j];
num[j] = temp;
i++;
j--;
}
}while(i<=j);
if(k<=j){
qsort(l,j);
}else if(k>=i){
qsort(i,r);
}else{
cout<<num[i-1];
return;
}
}
by Obijeb @ 2024-07-17 19:20:39
递归调用qsort的时候应写成return qsort();
一个有返回值的函数若没有返回任何值则会导致RE
就这题而言,主调函数应该将被调函数的返回值作为自己的返回值,以此实现答案最终传递回主函数并输出