作者在 2010-07-05 16:53:35 发布以下内容
查找第k小的数
问题描述:给定n个元素,要求从中找出第k小的元素。
文件输入:第一行两个整数:第一个是n表示有n个正整数(n<=50000),第二个整数k表示要查找第k小的元素;
第二行有n 个用空格隔开的整数。
文件输出:一个整数,第一个表示第k 小的元素的值。
样例输入:
5 3
23 8 91 56 4
样例输出:
23
#include<iostream>
using namespace std;
int a[20001],k;
int search(int le,int ri)
{
if(le==ri)return a[le];
int i=le,j=ri,mid=(i+j)/2,kk=a[mid];
a[mid]=a[le];
while(i<j)
{
while(i<j&&a[j]>=kk)j--;
a[i]=a[j];
while(i<j&&a[i]<=kk)i++;
a[j]=a[i];
}
a[i]=kk;
if(i==k)return kk;
if(k<=i-1)return search(le,i-1);
else return search(i+1,ri);
}
int main()
{
int n;
n=0;
while(1)
{
scanf("%d",&a[++n]);
if(a[n]<0)break;
}
cin>>k;
cout<<search(1,n-1);
}