60分求助(前两个数据超时,后三个数据过了,很疑惑为什么小数据搞不懂)

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

starlumia @ 2022-01-11 15:45:09

#include <iostream>
#include <stdio.h>

using namespace std;

int a[5000001],k,n;

void psort(int l, int r);

int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    psort(0,n-1);
    return 0;
}

void psort(int l, int r)
{
    int i=r,j=l;//i为基准,j为扫描
    bool jgti=0;
    while(j!=i){
        if(jgti){
            while(a[j]>a[i]) j--;
            jgti=0;
        }
        else{
            while(a[j]<a[i]) j++;
            jgti=1;
        }
        swap(i,j);
        swap(a[i],a[j]);
    }
    if(i==k){
        cout<<a[i];
        exit(0);
    }
    if(i<k){//找右边
        psort(i+1,r);
    }
    else{
        psort(l,i-1);
    }
}

这是以右为基准的快排的优化,以左为基准的只能40分,然后看论坛里以中间数为基准的可以拿100,想请各位大佬看看问题,主要是两个大数据都可以400ms过但是头两个小数据超时了总觉得很奇怪。


by Nevergonna_CCF @ 2022-01-11 16:43:38

有个函数叫 sort.

#include<bits/stdc++.h>
using namespace std;
int x[5000005],k;
int main()
{
    int n;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
        scanf("%d",&x[i]);
    sort(x,x+n);//快排
    printf("%d",x[k]);
}

C++98能过(不开02)


by joy2010WonderMaker @ 2022-01-11 17:39:30

@limuwen666 这就没意义了


by starlumia @ 2022-01-11 17:44:17

@limuwen666 我已经过啦,用以中为基准的方法,之前只是好奇为什么会这样

后面发现应该是最基本的左右基准的快速排序在处理升序和降序列的时候比较次数是o(n^2),所以导致的超时,后面两个大数据因为是随机数列,所以表现得比较好。

参考这篇文章得到的结论https://blog.csdn.net/lxk2017/article/details/102779042


|