灵活运用——快排
单纯用sort会超时,需要思考在快排中进行什么优化。
因为快排就是将区间划分为:(left<= j==i <=right)
1.小于等于x的区间
2.大于等于x的区间
而我们要找的是第k小的数,如果k在左区间内,则继续对左区间进行快排。如果k在右区间内,对右区间进行快排。如果k==j,则输出a[j]
1 #include <bits/stdc++.h>
2 using namespace std;
3
4 const int N=5e6+10;
5 int a[N];
6 int k;
7 void quick_sort(int l,int r)
8 {
9 if(l>=r)return ;
10 int i=l-1,j=r+1,x=a[l];
11 while(i<j)
12 {
13 do i++;while(a[i]<x);
14 do j--;while(a[j]>x);
15 if(i<=j)swap(a[i],a[j]);
16 }
17
18 //区间分成 left<= j=i <=right
19 if(k==j)
20 {
21 printf("%d",a[j]);
22 return ;
23 }
24 else if(k<j)quick_sort(l,j); //如果k在j左边,对左边进行快排
25 else if(k>j)quick_sort(j+1,r); //如果k在j右边,对右边进行快排
26 }
27 int main()
28 {
29 int n;
30 scanf("%d%d",&n,&k);
31 for(int i=0;i<n;i++)scanf("%d",&a[i]);
32 quick_sort(0,n-1);
33 return 0;
34 }