找寻一组数中出现次数最多的数
- 定义:数组a[n],整数x在数组a中出现的次数>(n/2),x即为多元素。
- 算法思路:1.次数大于n/2,每次去掉2个数仍可满足。2.有选择性的统计出现次数
寻找出现次数大于n/2的数
三大要素:数组、查找位置、n
1.参数:Count //重复+1,不重复-1
Data[n] //数据存储的地方
locate //寻数位置
2.思路:
//初始化
Count =1;
temp =Data[1];
//执行
从Data[2]开始向后扫描,for i=2 to n
if(Data[i]==temp) Count++;
if(Data[i]!=temp) Count--;
if(Count==0),对Data[i+1..n]再次寻找出现次数大于剩下数的一半的数
3.算法
uint32_t Candidate(uint32_t *Data, int locate, int n)
{
uint32_t temp = Data[locate];
int i,count = 1;
for(i = locate+1;i < n && count >0; i++){
if(Data[i] == temp)
count++;
else
count--;
}
if(i == n)
return temp;
else
return Candidate(Data, i+1, n);
}
在这个算法中有一个重要的隐含的意思,由于找寻的是超过一半的数,那么在count记为0时,拿掉之前的数,剩下的数据中超过一半的数即是整体数中超过一半的数。
判断寻找到的数是否符合要求
int Majority(uint32_t *Data, int n)
{
uint32_t temp= Candidate(Data, 1, n);
int i,count;
for(i=1; i<=n; i++){
if(Data[i] == temp)
count++;
if(count > n/2)
return temp;
else
return -1;
}
}