第k个数
首先上代码:
1 #include <iostream> 2 using namespace std; 3 const int N =100010; 4 int n,k; 5 int a[N]; 6 7 int findK(int a[],int l,int r,int k) 8 { 9 if(l>=r) return a[l]; 10 int x = a[l+r >>1]; 11 int i = l-1,j=r+1; 12 while(i<j) 13 { 14 do i++;while(a[i]<x); 15 do j--;while(a[j]>x); 16 if(i<j) swap(a[i],a[j]); 17 18 } 19 if(j+1>=k) return findK(a,l,j,k); 20 else return findK(a,j+1,r,k); 21 } 22 int main() 23 { 24 cin >> n>> k; 25 for(int i=0;i<n;i++) 26 { 27 cin >> a[i]; 28 } 29 int res = findK(a,0,n-1,k); 30 cout << res; 31 }
运用了快速排序的模板!
感觉唯一值得讲解的内容是:
意思是 如果k在左组就是排一下左边 右边没必要;
如果k在右边,左边无论如何,总比右边小 直接排序右边;