求教。直接输出函数返回值报错

P1923 【深基9.例4】求第 k 小的数

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

就这题而言,主调函数应该将被调函数的返回值作为自己的返回值,以此实现答案最终传递回主函数并输出


|