面试:用快排实现数组中的第K大的数

 1 #include <iostream>
 2 #include <cassert>
 3 using namespace std;
 4 
 5 int selectKth(int a[],int start,int end,int k){
 6     assert(start <= end && k <= end+1);
 7     int left = start;
 8     int right = end;
 9     int pivotVal = a[left];
10     while(left < right){
11         while(left < right && a[right] >= pivotVal) right--;
12         a[left] = a[right];
13         while(left < right && a[left] <= pivotVal) left++;
14         a[right] = a[left];
15     }
16     a[left] = pivotVal;
17     if(left+1 == k) return a[left];
18     else if(left+1 < k) return selectKth(a,left+1,end,k);
19     else return selectKth(a,start,left-1,k);
20 }
21 
22 int main() {
23     int a[10] = {1,3,5,6,7,8,2,4};
24 
25     std::cout << selectKth(a,0,7,2) << std::endl;
26     std::cout << selectKth(a,0,7,7) << std::endl;
27 
28     return 0;
29 }

 

posted @ 2017-08-01 15:14  wxquare  阅读(419)  评论(0编辑  收藏  举报