您的位置:首页 > 其它

中位数与第K小元素

2013-11-19 19:35 134 查看
算法实际上是模仿快速排序算法设计出来的,其基本思想也是对输入数组进行递归划分,与快速排序不同的是,它只对划分出来的子数组之一进行递归处理;

int randompartition(int a[],int l,int r)
{
int i=l-1,j=r,v=a[r],tmp;
for(;;)
{
while(a[++i]<v);
while(a[--j]>v)if(j==l)break;
if(i>=j)break;
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
tmp=a[i];a[i]=a[r];a[r]=tmp;
return i;
}


randompartition产生的划分基准是随机的,在这个条件下,可以证明算法randomselect可以在o(n)平均时间内找出n个输入元素的第k小元素。

消除randomselect尾递归的算法如下:

int randomselect(int a[],int l,int r,int k)
{
int i,j;
while(l<r)
{
i=randompartition(a,l,r);
j=i-l+1;
if(j==k)
return a[i];
if(j>k)
r=i-1;
else
{
l=i+1;
k-=j;
}
}
return ((r<i)?a[l]:a[r]);
}


解决算法与数据结构实验题10.1神谕者:


#include<stdio.h>
int a[50005];
int randompartition(int a[],int l,int r) { int i=l-1,j=r,v=a[r],tmp; for(;;) { while(a[++i]<v); while(a[--j]>v)if(j==l)break; if(i>=j)break; tmp=a[i]; a[i]=a[j]; a[j]=tmp; } tmp=a[i];a[i]=a[r];a[r]=tmp; return i; }
int randomselect(int a[],int l,int r,int k)
{
int i,j;
while(l<r)
{
i=randompartition(a,l,r);
j=i-l+1;
if(j==k)
return a[i];
if(j>k)
r=i-1;
else
{
l=i+1;
k-=j;
}
}
return ((r<i)?a[l]:a[r]);
}
int main()
{
int n,m,i,len,x,y;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
len=n;
for(i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
if(x==0)
a[len++]=y;
else
printf("%d\n",randomselect(a,0,len-1,y));
}
return 0;

}



View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: