链接:点击打开链接
题意:求无序数组的第k小
代码:
#include <queue>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n,k,ans,a[1000005];
int change(int ll,int rr){
int tt=a[ll];
while(ll<rr){
while(ll<rr&&a[rr]>tt)
rr--;
a[ll]=a[rr];
while(ll<rr&&a[ll]<tt)
ll++;
a[rr]=a[ll];
}
a[ll]=tt;
return ll;
}
void cal(int ll,int rr){
int op=change(ll,rr);
if(op==k){
ans=a[op];
return;
}
else if(op>k)
cal(ll,op-1);
else
cal(op+1,rr);
}
int main(){ //主要思想还是基于快排,就是在排序的时候
int i; //根据左右区间的大小从而只在一个区间继续排序
while(scanf("%d%d",&n,&k)!=EOF){ //这样做相比直接排序求第k小的复杂度的常数要小
for(i=1;i<=n;i++) //期望复杂度为O(n+n/2+n/4+...+1)=O(2N)
scanf("%d",&a[i]); //但是既然是基于快排的思想,我们依然可以构造
if(k<=0||k>n){ //一个递增或递减的数列叉掉这个算法
puts("-1"); //所以我们依然可以先随机化一下再进行操作
continue;
}
cal(1,n);
printf("%d\n",ans);
}
return 0;
}