博客园  :: 首页  :: 新随笔  :: 管理

 

 1 #include<iostream>
 2 using namespace std;
 3 void swap(int &a, int &b)
 4 {
 5     int temp = a;
 6     a = b;
 7     b = temp;
 8 }
 9 int partition(int a[],int begin,int end)
10 {
11     int low,high,key;
12     low = begin;
13     high = end;
14     key = a[low];
15     while(low < high)
16     {
17         while(low < high && a[high] >= key) 
18             high--;
19         a[low++]=a[high];
20         while(low < high && a[low] <= key ) 
21             low++;
22         a[high--]=a[low];
23     }
24     a[low] = key;
25     return low;
26 }
27 void qsort(int a[], int begin, int end)
28 {
29     int p = partition(a,begin,end);
30     if(p > begin)
31         qsort(a, begin,p-1);
32     if(p < end)
33         qsort(a,p+1,end);
34 }
35 int findK(int a[],int begin, int end,int k)
36 {
37     if(!(k>=begin && k<= end))
38         return 0;
39     int p = partition(a,begin,end);
40     static int count =1;
41     cout << "sorted:" << count << "\t" <<"p:" << p<<endl;
42     count++;
43     for(int i=0;i<6;i++){
44         cout << a[i]<<" ";
45     }
46     cout <<endl;
47     if(p > k)
48         findK(a,begin,p-1,k);   //若p>k,则要查找的数据在前部分;
49     else if(p < k)
50         findK(a,p+1,end,k);  //若p<k,则要查找的数据在后部分;注意是在后部分要查找第k-(p+1)大的数,因为数组长度是从p+1到end,而非0...end-p.
51     else if(p == k)
52         return a[p];
53 }
54 int main()
55 {
56     int a[] = {5,2,3,4,6,8},i;
57     for(i =0; i<6;i++)    cout<<a[i]<<' ';
58     cout<<endl;
59     int k = findK(a,0,5,1);
60     cout<<k<<endl;
61     return 0;   
62 }

最好的情况下,一次快排结束后,即找到第k大的数,时间复杂度为O(n);

最坏的情况下,每次都只能找到排除一个数,则时间复杂度为O(kn)。

关于复杂度分析,如有人有其他意见,欢迎评论。