一个在时间复杂度为O(n)情况下找第k大的数的算法

利用快速排序,在进行完一次快排之后,让k和分成的两个子数组比较,比如说a[p……r] 被分成了 a[p……q]和 a[q+1……r] 让这个K和左边的子数组中元素的个数比较,如果大于,则递归左区间
如果小于,则递归右区间。这样,在期望意义下,程序的时间复制度为O(n)

 1 #include<stdio.h>
2 #include<iostream>
3 #include<string.h>
4 using namespace std;
5 #define N 10000
6 int a[N];
7 void sortt(int l,int r,int k)
8 {
9 int ll = l,rr = r;
10 int key = a[l];
11 if(ll >= rr) return ;
12 while(ll < rr)
13 {
14 while(ll < rr && a[rr] >= key) rr--;
15 a[ll]=a[rr];
16 while(ll < rr && a[ll] <= key) ll++;
17 a[rr]=a[ll];
18 }
19 a[ll] = key;
20 if(k > ll - l + 1) sortt(ll + 1, r, k);
21 else sortt(l, ll, k);
22 }
23 int main()
24 {
25 int i;
26 int n,k;
27 while(cin>>n,n)
28 {
29 for(i=0;i<n;i++)
30 cin>>a[i];
31 cin>>k;
32 sortt(0,n-1,k);
33 cout<<a[k-1]<<endl;
34 }
35 return 0;
36 }

 

转载于:https://www.cnblogs.com/fxh19911107/archive/2012/03/12/2392471.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值