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