分治与递归-找k个临近中位数的数
2018-12-04 07:14:31来源:博客园 阅读 ()
问题描述:给定由n个互不相同的数组成的集合S以及正整数k≤n,试设计一个O(n)时间算法找出S中最接近S的中位数的k个数。
算法描述:
- 用线性时间选择实现的算法找到中位数
- S’=除去中位数外的S
- S"=|S'中的数值-中位数的值|
- 用线性时间选择实现的算法找到第k个最小的数
- 输出S”中小于第k个最小的数的数对应的S中的值
算法实现:
selectorder函数、partition函数、sord函数同线性时间选择程序的算法实现,故略。 int main() { void sord(int a[],int h,int t); int selectorder(int x,int a[],int h,int t); int partition(int a[],int h,int t,int k); int n; scanf("%d",&n); int *a; a=(int *)malloc(sizeof(int)*n); for(int i=0;i<n;i++) a[i]=rand(); for(int i=0;i<n;i++) printf("%d ",a[i]); //动态分配数组a //随机生成数组a元素、输出 /* int n=7; int a[7]={0,-1,20,-4,-100,2000,2001}; for(int i=0;i<n;i++) printf("%d ",a[i]); */ printf("\n"); int middle; middle=selectorder((n-1)/2,a,0,n-1); printf("%d\n",middle); //找到数组a中的中位数并赋值给middle int *b; b=(int *)malloc(sizeof(int)*n); for(int i=0;i<n;i++) if(a[i]>=middle)b[i]=a[i]-middle; else b[i]=middle-a[i]; //动态分配数组b //数组b中元素=|数组a中元素-middle| int *c; c=(int *)malloc(sizeof(int)*n); for(int i=0;i<n;i++)c[i]=b[i]; //数组c中元素=数组b中元素 int k; scanf("%d",&k); //输入k int last; last=selectorder(k-1,b,0,n-1); //找到数组b中第k小元素并赋值给last for(int i=0;i<n;i++) if(c[i]<=last)printf("%d ",a[i]); //遍历数组c,如果数组c中元素小于last, //则输出对应位置上数组a的元素 printf("\n"); sord(a,0,n-1); for(int i=0;i<n;i++)printf("%d ",a[i]); return 0; }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:02_有符号数与无符号数
下一篇:第五章 C程序结构
- DSA_07:递归算法 2020-03-30
- 递归函数使用动态数组遇到的问题 2020-03-26
- 递归遍历树 2019-11-16
- RWMutex:共享/专有的递归互斥锁 2019-10-12
- C++分治策略实现快速排序 2019-10-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash