【题目描述】
用分治法编程解决在n(0<n<=1000)个数当中找第K小元素问题(注意:不能用排序)
【输入】
第一行输入n的值,第二行输入n个数,第三行输入K的值。
【输出】
n个数中的第K小元素。
【输入样例】
5
8 1 3 6 9
3
【输出样例】
6
#include<stdio.h>
int a[100000]={0};
void Swap(int x,int y)
{
int temp=a[x];
a[x]=a[y];
a[y]=temp;
}
void Bubble(int p,int r)
{
int i,j,t;
for(i=p;i<=r;i++)
{
t=i;
for(j=i+1;j<=r;j++)
if(a[j]<a[t]) t=j;
if(t!=i) Swap(i,t);
}
}
int Partition(int p,int r,int x)
{
int i=p-1,j=r+1,t;
for(t=0;;t++)
{
while(a[++i]<x&&i<r);
while(a[--j]>x);
if(i>=j) break;
Swap(i,j);
}
return j;
}
int Select(int p,int r,int k)
{
int i,s,t,x,j;
if(r-p<75)
{
Bubble(p,r);
return a[p+k-1];
}
for(i=0;i<=(r-p-4)/5;i++)
{
s=p+5*i;
t=s+4;
Bubble(s,t);
Swap(p+i,s+2);
}
x=Select(p,p+(r-p-4)/5,(r-p+6)/10);
i=Partition(p,r,x);
j=i-p+1;
if(k<=j) return Select(p,i,k);
else return Select(i+1,r,k-j);
}
int main()
{
int n,k,i,x;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
x=Select(0,n-1,k);
printf("%d\n",x);
return 0;
}