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 }