灵活运用——快排

 

 

单纯用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 }

 

posted @ 2022-02-03 12:30  wellerency  阅读(54)  评论(0编辑  收藏  举报