主元素问题

 1 /*主元素问题:数组中是否存在一个元素重复大于n/2次
 2 思路:
 3 1,推排序,快排,归并排序后,取a[n/2]再遍历一次验证 o(nlogn)
 4 
 5 2, 计数排序, o(n),要求数据分布较均匀,且是整数
 6 
 7 3,删除两个不一样的元素,数组的主元素保持不变. 
 8    超过一半的这个主元素比其它元素都多,设seed=主元素,
 9    遇到不一样的减一,一样的加一,最后seed至少为1。 o(n)
10 */              
11 #include<iostream>
12 
13 using namespace std;
14 
15 typedef int T;
16 
17 int findMajor(T *a, int n)
18 {
19     int count=0,i;
20     T seed;
21     for(i=0;i<n;i++)
22     {
23         if(0==count)
24         {
25             seed=a[i];
26             count++;
27         }
28         else if(seed==a[i])
29             count++;
30         else if(seed!=a[i])
31             count--;
32     }
33     count=0;
34     for(i=0;i<n;i++)//最后要验证
35     {
36         if(seed==a[i])
37             count++;
38     }
39     if(count>n/2)
40         return seed;
41     else
42         return -1;
43 }
44 
45 int main()
46 {
47     T a[]={2,3,1,2,2,2,5,4,2,2};
48     int size=10;
49     int major=findMajor(a,size);
50     if(major==-1)
51         cout<<"no";
52     else
53         cout<<major;
54     cout<<endl;
55     return 0;
56 }
原文地址:https://www.cnblogs.com/fkissx/p/4503965.html