第k小的数

warning: 这篇文章距离上次修改已过206天,其中的内容可能已经有所变动。

要求第k小的数,直接做法就是先通过从小到大排序,取第k个数就可以了,但是这样的平均复杂度至少为O(nlogn),但是我们可以基于快速排序的划分来处理这个问题,平均时间为O(n)

#include<iostream>
using namespace std;
const int N = 100010;
int n,k;
int a[N];
void visit()
{
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
}
int quick_find(int k,int l,int r)
{
    int i=l,j=r;
    int temp=a[l];
    while(i<j){
        while(i<j&&a[j]>=temp)j--;
        a[i]=a[j];
        while(i<j&&a[i]<=temp)i++;
        a[j]=a[i];
    }
    a[i]=temp;
    if(i==k-1)return a[i];
    else if(i>k-1)return quick_find(k,l,i-1);
    else return quick_find(k,i+1,r);
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    cout<<quick_find(k,0,n-1);
    return 0;
}
none
最后修改于:2021年10月21日 18:36

添加新评论