一个在时间复杂度为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 }

 

posted @ 2012-03-12 21:24  AC_Girl  阅读(670)  评论(0编辑  收藏  举报