C程序设计的抽象思维-算法分析-大多数元素

本文介绍了一个在O(N)时间内找出数组中出现次数超过一半的元素的算法,并提供了具体实现代码。该算法采用Boyer-Moore投票算法,仅使用常数级别的额外空间。

【问题】

请编写下面函数 int MajorityElement(int array[],int n);

该函数返回数组array中的多数元素。多数元素是指在占绝对多数(至少51%)的一个值。假设多数元素不存在。那么返回常量NoMajorityElement,该函数必须满足以下的条件:
 1. 必须以O(N)时间执行。
 2. 必须使用O(1)的附加空间。换句话说,可用个别的暂时变量,而不能够使用不论什么的暂时数组。

而且不能使用递归解决,这是由于随着递归层数加深,会须要空间来存储栈帧。


 3. 不能改变数组中的不论什么元素的值。

【代码】

#include <stdio.h>

void MajorityElement(int array[], int n)
{
	int majority, i, count;
	majority = array[0];
	count = 1;
	for(i = 1; i < n; i++){
		if(majority != array[i]){
			if(count == 0){
				majority = array[i];
				count++;
			}else{
				count--;
			}
		}else{
			count++;
		}
	}
	if(count > 0)
		printf("MajorityElement: %d\n", majority);
	else
		printf("NoMajorityElement\n");

}

main()
{
	int array[5] = {1, 2, 1, 2, 3};
	MajorityElement(array, 5);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值