算法基础之快速选择
快速选择
找出数组排序后第k个数
-
主要思想:分治(代码跟快排很像)
-
#include<iostream> using namespace std; const int N =1e6+10; int p[N]; int n,k; int quick_sort(int l,int r,int k){ if(l==r) return p[l]; //只有一个数据的数组 返回左右都可以 int x=p[l],i=l-1,j=r+1; while(i<j){ do i++; while(p[i]<x); //while(p[++i]<x);也可以 do j--; while(p[j]>x); //while(p[--j]>x);//也可以 if(i<j) swap(p[i],p[j]); } int sl=j-l+1; //求出左边<=x的元素个数 与k比较 if(k<=sl) return quick_sort(l,j,k); //如果k<sl 那么p[k]一定在左边 只用递归对左边排序即可 return quick_sort(j+1,r,k-sl); //如果k>sl 在右边 传入k时注意减去sl } int main(){ cin>>n>>k; for(int i=0;i<n;i++){ cin>>p[i]; } cout<<quick_sort(0,n-1,k)<<endl; }