求主元素
来源:互联网 发布:加工中心攻丝怎么编程 编辑:程序博客网 时间:2024/06/18 07:29
求主元素:先求出中位数,由于主元素必为中位数,因此只需要判断中位数出现次数是否大于n/2即可。
寻找中位数:用线性方法寻找第k大的数即可在O(n)内找到中位数。
设T[0:n-1]是n个元素的数组。对任一元素x,设S(x)={ i | T[i]=x}。当|S(x)|>n/2时,称x为主元素。设计一个线性时间算法,确定T[0:n-1]是否有一个主元素。
#include <iostream>#include <cstdlib>#include <cstdio>#include <algorithm>#define N 100005using namespace std;int partition(int a[], int s, int e){int m = (s + e) / 2;int i = s, j = e;int pivot = a[s];while (i < j){while (i < j && a[j] >= pivot)j--;swap(a[i], a[j]);while (i < j &&a[i] <= pivot)i++;swap(a[i], a[j]);}return i;}int search(int a[], int s, int e, int k){if (s == e)return a[s];else{int pivot = partition(a, s, e);int tmp = pivot - s + 1;//位于枢轴左边的元素个数(包括枢轴)if (tmp == k)//枢轴正好位于第k大的数的位置return a[s + k - 1];if (tmp > k)//从左半边找第k大的数return search(a, s, pivot - 1, k);else//从右半面找第k-tmp大的数return search(a, pivot + 1, e, k - tmp);}}void judge(int a[], int n, int num){int cnt = 0;for (int i = 0; i < n; i++){if (a[i] == num)cnt++;}if (cnt > n / 2)printf("主元素为%d\n", num);elseprintf("不存在主元素\n");}int main(){freopen("e:\\input.txt", "r", stdin);int a[N];int n;while (~scanf("%d", &n)){for (int i = 0; i < n; i++)scanf("%d", &a[i]);int ans = search(a, 0, n-1, n / 2);//ans为中位数judge(a,n,ans);}return 0;}
0 0
- 求主元素
- 求主元素
- 求数组的主元素
- 求矩阵的外围元素之和,主对角线元素之和以及副对角线元素之和
- 求数组元素地址
- 求数组元素个数
- 计算方法列主元素消去法求线性方程组的解
- FORTRAN 函数子程序 求二维数组主对角元素和
- zoj 2132 求一个数组的主元素
- 关于求矩阵主对角线元素之和及副对角线元素之和的问题
- 求数组所有元素之和
- 求K个最小元素
- 求数组的主要元素
- 求数组元素的乘积
- 求栈的最小元素
- 求数组中元素个数
- 求队列中元素个数
- 求数组元素最大差值
- Java得到系统剪贴板&获取桌面路径&生成Excel文件
- 安全圈个人认识浅谈
- 判断一个点是否在图片里
- 支持向量机算法
- 版本控制软件详解
- 求主元素
- int的极值
- 4.2解救小哈
- Git命令操作详解
- 【BZOJ4027】【HEOI2015】兔子与樱花(贪心+dp)
- 把阿拉伯数字全部转换为大写(1,2,3.... = 一、二、三、)
- ionic 跨页面传值的几种方法
- 机器学习及神经网络发展历程
- 单链表