题干
思路解析:遍历数组元素,标记出一个可以成为主元素的元素Num,然后重新计数,确认Num是否是主元素
算法分为两步:① 选取候选的主元素过程:依次遍历所给数组的每个整数,将第一个遇到的整数Num保存到c中,记录Num出现的次数为1,若下一次遇到的整数仍然为Num,则计数加1,否则减1;当计数减到0的时候,重新选取新的Num为c,并且重新开始计数,直到遍历完全部元素
② 判断c的元素是否可以成为真正的主元素:扫描原来的数组,统计c出现的次数,如果大于n/2,有主元素,否则,不存在主元素。
int Majority(int A[],int n)
int i,c,count=1; //计数器count,候选主元素c
c=A[0] //把数组第一个元素记作第一个候选主元素,此时c=A[0],如果后面的元素与之相等,进行累加1,否则减1;当计数器为0时候,把当前遍历的元素记作候选元素
for (i=1;i<n;i++) //遍历整个数组
if (A[i] == c) //和后面元素比较
count++; //相等计数器加1
else
if (count>0) //否则,计数器减1(前提是计数器不为0),计数器为0时候,要重新开始计数,count置1
count--;
else{ //计数器为0时候,要重新开始计数,count置1,候选元素重置
c=A[i];
count=1;
}
if (count>0) //存在候选元素
for (i=count=0;i<n;i++) //遍历原来数组,并计算候选元素在原来数组中出现的次数
if(A[i] == c)
count++;
if (count>n/2) return c; //次数大于一半表长,返回主元素
else return -1; //否则返回-1