任务:
给一个整数序列和一个数k,求这个序列中的第k小的数。
思路:
从序列中取一个数mid,然后把这个序列分成小于等于mid的和大于等于的两部分,由两个部分的的元素个数,和k 的大小关系可以确定这个数是在哪个部分。对部分序列的探查可以递推处理。
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn = 10005;
int a[maxn];
int n,k;
bool vis[maxn];
void Search(int k,int l,int r)
{
int i = l,j = r,mid = a[(l + r) >> 1];
do
{
while( a[i] < mid)++ i;
while( a[j] > mid)-- j;
if(i <= j)
{
swap(a[i],a[j]);
++i;-- j;
}
}while(i <= j);
if(i <= r && k >= i - l + 1) Search(k - (i - l),i,r);
if(j >= l && k <= j - l + 1) Search(k,l,j);
}
int main()
{
cin >> n;
for(int i = 0;i < n;i ++)
{
cin >> a[i];
}
cin >> k;
Search(k,0,n - 1);
cout << a[k - 1] << endl;
return 0;
}