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)。
关于复杂度分析,如有人有其他意见,欢迎评论。