第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在右边,左边无论如何,总比右边小 直接排序右边;

 

posted on 2023-01-01 22:59  hate_GIS  阅读(21)  评论(0)    收藏  举报

导航