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 }