最大众数问题
来源:互联网 发布:如何优化淘宝排名 编辑:程序博客网 时间:2024/06/09 15:16
(1)快速排序 (2)求中位数 (3)计算出中位数的最左端和最右端的位置,然后分割成2段数组 (4)中位数个数与左端个数比较,中<左 即最大众数可能存在左端,将左端再进行2段分割(递归)直到 中 > 左为止 右端同理。。。*/#include <stdio.h>#include <stdlib.h>int largest,element,a[101];int cmp(const void *a,const void *b){ return *(int *)a - *(int *)b;}int median(int a[],int left,int right)//求中位数{ return a[(left + right)/2];}void sqlit(int a[],int middle,int left,int right,int *ll,int *rr)//计算中位数个数最左端和最右端{ int i,j; i = j = (left + right) / 2; while(a[--i] == middle); //寻找左端与中位数第一个相等的位置 *ll = i + 1; //上面的i已经超出中位数,即后退一步 while(a[++j] == middle);//寻找右端与中位数最后一个相等的位置 *rr = j - 1;//上面的j已经超出中位数,即后退一步}void mode(int left,int right){ int ll,rr; int middle = median(a,left,right);//求中位数 sqlit(a,middle,left,right,&ll,&rr);//分割数组 if(largest < rr - ll + 1)//寻找最大重数 { largest = rr - ll + 1; element = middle; } if(ll - left > largest)//左边的个数大于中位数的个数从左边再寻找 mode(left,ll - 1); if(right - rr > largest)//右边的个数大于中位数的个数从右边再寻找 mode(rr + 1,right);}int main(){ int n,m,i; scanf("%d",&n); while(n--) { scanf("%d",&m); for(i=0;i<m;i++) scanf("%d",&a[i]); qsort(a,m,sizeof(a[0]),cmp); mode(0,m-1); printf("%d %d\n",element,largest); } return 0;}
阅读全文
0 0
- 最大众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 众数问题
- 从安装Ubuntu一直到TensorFlow的安装
- 小程序---计算器
- Leetcode_3Sum
- 设计模式之适配器模式
- golang tcp粘包处理
- 最大众数问题
- webpack配置的entry和output new
- 扑克牌 BZOJ
- SpringMVC返回视图
- 阻塞队列LinkedBlockingQueue源码分析
- Android笔记
- 103. Binary Tree Zigzag Level Order Traversal
- 【第八周项目4】字符串加密
- vxworks shell 调试常用命令