C++博客
尋找眾數的算法很多,比如用排序,然后打印出array[n/2]就可以了,但最好的只達到O(n*logn);但要達到O(n)的話,就要尋找新的方法,借鑒學C的時候,統計一個字符串(只含小寫的字母)中每個字母的個數的方法:它是為了減少空間的,采用array[a[i]-'a']++(當然需要初始化為0)來做得,所以我們也可以采用同樣的思路來做,但是這個數組必須是非負的,因為它要做數組的下標,而且這個數組的大小必須是比你要輸入數組的最大的數要大,否則就會越界。

 1/*
 2  Name:
 3  Copyright:
 4  Author: LonelyTree
 5  Date: 21-09-08 20:31
 6  Description: 就是對輸入的正整數的個數進行統計,找出其中超過一半的數字,時間復雜度為O(n).
 7*/

 8
 9#include<stdio.h>
10int main()
11{
12    int array[100000],n;
13    int count,temp,i;
14    scanf("%d",&count);
15    while(count--)
16    {
17        scanf("%d",&n);
18        for(i=0;i<100000;i++)
19        {
20            array[i]=0;
21        }

22        for(i=0;i<n;i++)
23        {
24            scanf("%d",&temp);
25            array[temp]++;
26            /*printf("temp=%d\n",temp);
27            printf("array[%d]=%d\n",temp,array[temp]);*/

28        }

29        for(i=0;i<100000;i++)
30        {
31            if(array[i]>n/2)
32            {
33                printf("%d\n",i);
34            }

35        }

36    }

37    system("PAUSE");
38    return 0;
39}

40
41
42
43

這個跟桶排比較像,貌似可以用基數排序達到O(n),這個有點不會寫。其實還有一個用快速排序的思路做得……
這個就是后話了!有興趣的話可以在下面討論討論!