中位数与第K小元素
2013-11-19 19:35
134 查看
算法实际上是模仿快速排序算法设计出来的,其基本思想也是对输入数组进行递归划分,与快速排序不同的是,它只对划分出来的子数组之一进行递归处理;
randompartition产生的划分基准是随机的,在这个条件下,可以证明算法randomselect可以在o(n)平均时间内找出n个输入元素的第k小元素。
消除randomselect尾递归的算法如下:
解决算法与数据结构实验题10.1神谕者:
View Code
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
相关文章推荐
- 买技术类书这点事
- Cocos2d-x UIView和Coco2d-x场景之间的相互跳转切换
- Android开发学习笔记 by ZhangJie
- Some useful java codes
- 机房收费系统—总结
- TOS/DSCP对照表
- MySQL DATE_FORMATE函数内置字符集的坑_转小叶子爹
- Nodejs解析HTML网页模块 jsdom
- 腾讯QQ群关系数据被泄露了?
- ASP.Net MVC3 图片上传详解(form.js,bootstrap)
- 查找黑客老巢的方法
- 多行文件变一行
- 石子合并
- PHP expecting T_STRING or T_VARIABLE or T_NUM_STRING
- struts2不能通过ONGL方式取出request中的Atrribute
- 三十了终于明白了些事
- wince中的背光灯控制
- MFC中文档与视图(二)
- 如果要求精确的答案,请避免使用float和double
- 第13周作业 她胖吗