用时间复杂度O(n)的算法。
已知一个整数序列A=(a0,a1,a2…an),其中 0 <= ai < n 。若存在ap1 = ap2 = ap3 =…apm =X,且m > n/2,( 0 <= pk < n ,1 <= k <=m ) ,则称X为序列X的主元素
思路:序列中删去两个不相等的数,主元素不变。
步骤一:选择第一个元素为候选主元素,使用一个计数器,初始值为1,碰见一个相同值的元素,计数器加1否则减一。若计数器的值已经等于0,则更换为下个元素为候选主元素。最后计数器值的意义是从左到右不停删去两个不相等的数,剩下相同数即候补主元素的个数。
步骤二:判断是否是真正的主元素,统计候补主元素个数
int majority(int A[],int n)
{
int i,c,count=1;
c=A[0];
for(i=1;i<n;++i){
if(A[i]==c)
count++;
else{
if(count>0)
count--;
else{
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;
}