prova questa, ordina l'array e poi conta la lunghezza dei gruppi di valori
esempio
1,1,1,1,3,3,3,3,3,5,5,6,6,7,7

gruppo 1 lungo 4
gruppo 3 lungo 5,
gruppo 5 lungo 2
.....

vince il gruppo piu lungo

codice:
#include <algorithm>
int freq(int*a, size_t a_len)
{
  int*b=&a[a_len];
  int cur, c_cur=0, best, c_best=0; 	

  std::sort(a, b);

  while(a<b)
  {
    cur = *a++;
    if(++c_cur > c_best)c_best=c_cur, best=cur;
    if(*a!=cur)c_cur=0;
  }
  return best;
}
Complessita O(NlogN(se l'algoritmo di sort e' efficiente) + n(la scansione dell'array ordinato)), circa uguale a =(NlogN)

oppure crea una mappa in memoria dove associ i valori trovati nell'array a un conteggio, se conosci la STL
codice:
#include <map>
int freq(int*a, size_t a_len)
{
  int*b=&a[a_len];
	
  std::map<int,int>m;
  std::pair<std::map<int,int>::iterator ,bool>i;

  int best, c_best;

  while(a<b)
  {
    if(i = m.insert(std::map<int,int>::value_type (*a, 1)), !i.second) 
    i.first->second ++;
    if(i.first->second>c_best)    
      best = *a, c_best=i.first->second;
    ++a;
  }
  return best;
}
in questo caso la complessita' e' O(N) + la complessita' dell'insert nella mappa che non conosco