【洛谷 P1923】 【分治】 求第k小的数
题目
解题思路
类似快排的思想
但不需要重复怎么多次
例:找第k小
如果当前左区间的右边界大于k
就可以不在排序左区间了
因为左区间的数都比第k小数小
代码
#include<iostream>
#include<cstdio>
#include<stdlib.h>
using namespace std;
int n,k,a[5000010];
void qsort(int l,int r)
{
if (l>=r) return;
int x=l,y=r,mid=a[(l+r)/2];
do{
while (a[l]<mid) l++;
while (a[r]>mid) r--;
if (l<=r)
{
int c=a[l];
a[l]=a[r];
a[r]=c;
l++,r--;
}
}while (l<=r);
if (r>=k)
qsort(x,r);
if (l<=k)
qsort(l,y);
else {
printf("%d ",a[k+1]);
exit(0);
}
}
int main()
{
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
qsort(1,n);
return 0;
}