为什么会超时,我这个不是O(n)么

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

xiuman @ 2024-01-28 18:15:38

#include<bits/stdc++.h>
using namespace std;
int a[5000002]{};
int n,k;
void qsort(int low,int high){
    int i=low,j=high,flag=a[(high+low)/2];
    do{
        while(a[i]<flag)i++;
        while(a[j]>flag)j--;
        if(i<=j){
            swap(a[i],a[j]);
            i++;j--;
        }
    }while(i<=j);
    if(k<=j)qsort(low,j);
    else if(i<=k)qsort(i,high);
    else {
        cout<<a[k];
        return;
    } 
}
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    qsort(0,n-1);
}

by 细数繁星 @ 2024-01-28 18:22:17

@xiuman qsort 是 O(n\log n) 可能还会退化成 O(n^2)


by xiaoshumiao @ 2024-01-28 18:29:16

@2044_space_elevator 处理的区间每次都会减半,所以是线性的。他这不是标准的快速排序,而是改进的快排。


by jiadahao @ 2024-01-28 20:02:34

sort不行吗?????


by xiuman @ 2024-01-28 20:16:15

@jiadahao 我想看看我这个到底出了什么问题


by prlygates1121 @ 2024-02-06 00:46:54

@xiuman 咱俩前面写的几乎一样。事实证明读取n个数字的时候要用scanf而不能用cin,后者似乎更耗时间。


|