若A[1..n]中有一个数出现次数大于n/2,在O(n)时间内找出众数及其重数
思路:
因为众数出现次数多于n/2,
那么,从A[]中取一对不同的数,删除,如此重复。最后剩下的或为一个数,或为一组相同的数,它就是我们要找的众数。
这样,两次遍历数组,一次找到众数,一次记数其重数。时间O(n)。
#include <stdio.h>
#include <stdlib.h>
void main()
{ //若A[1..n]中众数出现次数多于n/2,O(n)时间的算法
int A[]={0,2,3,2,2,4,2,2,5,2,2,2,6,2,7,8,2,2,4,4};
int Count = 1;
int H = A[0];
int n = sizeof(A)/sizeof(int);
printf("%d/n",n);
int i;
for(i=1; i<n; i++) //找出众数
{
if( H == A[i])
Count++;
else
{
Count--;
if(Count == 0)
{
i = i + 1;
H = A[i];
Count = 1;
}
}
}
Count = 0;
for(i=0; i<n; i++) //记数其重数
{
if( A[i]==H)
Count++;
}
printf("众数:%d,重数:%d",H,Count);
}