[面试]第k大的数

发布时间:2019年09月09日 阅读:245 次

面试题:从n个数中找出第K大的数

https://blog.csdn.net/orangefly0214/article/details/86527462

选一个枢轴点,用快排的方法将数组分为两部分,位于枢轴点左边的数都比它大,位于枢轴点右边的数都比它小,


1)如果枢轴点的索引刚好是k-1,则此时它对应的就是数组的第k大的数;


2)如果比k-1大,那么第k大的数位于它的左边部分;


3)如果比k-1小,那么第k大的数位于它的右边部分;

————————————————


#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<set>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstdlib>
#include<cstring>
#include<vector>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef unsigned int uI;
typedef double db;
#define maxn 100005
#define inf 0x3f3f3f3f
#define maxm 200005
#define maxq 100005
 
int a[5000006],k;
 
int quicksort(int l,int r)
{
    if(l==r) return a[l];
    int i,j,x=a[l];
    if(l<r)
    {
        i=l,j=r;
        while(i<j)
        {
            while(i<j&&a[j]<=x) --j;
            if(i<j) a[i++]=a[j];
            while(i<j&&a[i]>=x) ++i;
            if(i<j) a[j--]=a[i];
        }
        a[i]=x;
        if(i==k) return a[i];
        if(i<k) return quicksort(i+1,r);
        else return quicksort(l,i-1);
    }
}
 
int main()
{
    int n,i;
    while(~scanf("%d%d",&n,&k))
    {
        for(i=1;i<=n;++i) scanf("%d",&a[i]);
        printf("%d\n",quicksort(1,n));
    }
    return 0;
}


Tag:
相关文章

发表评论: