题意:给定一个序列,求出其中出现最频繁的数字。
先来一个快排,将所有的序列排列,然后遍历这个数组,得到每个数出现的次数并不断更新,最后就可以得到答案,用算法分析来看就是,快排O(n*log n) + 遍历维护O(n) = O(n * log n);
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void * a, const void * b)
{
return (*(long *)a-*(long *)b);
}
int main()
{
long a[100002],i,j,k,n,max,max_num,temp,temp_num;
int flag;
while (scanf("%ld",&n) != EOF)
{
for(i=0;i<n;i++)
scanf("%ld",&a[i]);
qsort(a,n,sizeof(a[0]),cmp);
k = 1;
max = a[0];
max_num = 1;
while(1)
{
if(a[0]==a[k])
{
max_num++;
}
else
break;
k++;
}
temp_num = 0;
flag = 1;
for(i=k;i<n;i++)
{
if(flag)
temp = a[i];
if(temp==a[i])
{
temp_num++;
flag = 0;
}
else
{
if(temp_num>max_num)
{
max_num = temp_num;
max = temp;
}
temp_num = 0;
flag = 1;
i--;
}
}
printf("%ld\n",max);
}
}