hihoCoder37周 分治 O(n)第k大数~

来源:互联网 发布:腾讯云怎么解析cn域名 编辑:程序博客网 时间:2024/06/02 19:09

题意 给你无序序列,找第k大的数

思路 直接排序就能过。。。不过为了练练手,就写了个O(n)的算法~很经典~

   快排算法是向枢轴两侧递归的去快排,而这里只向一边去快排,当枢轴位置>k,向左快排,反之,向右即可~

#include <iostream>#include <cmath>#include <algorithm>#include <cstdio>using namespace std;int a[1000006];int n,k;int partition(int l,int r){while(l != r){while(a[r] >= a[l] && r > l)r--;if(l == r)break;swap(a[r],a[l]);while(a[l] < a[r] && r > l)l++;if(l < r)swap(a[r],a[l]);}return l;}int findK(int l,int r){int now = partition(l,r);if(k < now)return findK(l,now-1);else if(k > now)return findK(now+1,r);elsereturn a[now];}int main(){scanf("%d%d",&n,&k);k--;for(int i=0;i<n;i++){scanf("%d",&a[i]);}printf("%d\n",findK(0,n-1));return 0;}


0 0