AcWing 786. 第k个数

原题链接

考察:快速排序

思路:

        快速排序的原理是将小于基准点的数全部放在基准点左边,大于全部放在右边,等于随机.我们要找第k小的数,当快速排序把区间一分为2的时候,如果左边的长度>k,说明第k小的数在左边,如果<说明要找右边找k-cnt(左边的长度)个数.

        当我们不断递归的时候,区间会减小通过计算左右区间的长度(因为分好后区间与区间之间有序),我们就能通过区间大小判断k的位置

 1 #include <iostream>
 2 using namespace std;
 3 const int N = 100010;
 4 int k,a[N],n;
 5 int quick_sort(int l,int r,int k)//局部变量覆盖全局变量
 6 {
 7     if(l==r) return a[r];
 8     int x = a[l+r>>1];
 9     int i = l-1; int j = r+1;
10     while(i<j){//当快速排序完成的时候,看是否左边和右边的个数
11         while(a[++i]<x);
12         while(a[--j]>x);//存在j超过i的情况
13         if(i<j) swap(a[i],a[j]);
14     }
15     int s = j-l+1;
16     if(s>=k) return quick_sort(l,j,k);//通过不断递归,最后区间会被压缩到长度只有1
17     else return quick_sort(j+1,r,k-s);//如果左边数不够,要把前面k-s个更小的元素减去
18 }
19 int main()
20 {
21     scanf("%d%d",&n,&k);
22     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
23     printf("%d\n",quick_sort(1,n,k));
24     return 0;
25 }

 

posted @ 2021-01-06 00:25  acmloser  阅读(68)  评论(0编辑  收藏  举报