Ecco una soluzione che non usa nessun array aggiuntivo, così siamo tutti più contenti:
codice:
#include <stdlib.h>
int getFashion(int * inarray, int elements);
int compFunction(const void * elem1, const void * elem2);
void main()
{
int intarray[]={16, 51, 84, 83, 15, 15, 15, 15, 15, 10, 84};
printf("%d",getFashion(intarray,sizeof(intarray)/sizeof(int)));
getch();
return;
}
int getFashion(int * inarray, int elements)
{
int pivotelem=0;
int pivotoccur=1;
int curoccur=1;
int c;
qsort(inarray, elements, sizeof(int), compFunction);
pivotelem=inarray[0];
for(c=1; c<elements; c++)
{
if(inarray[c]==inarray[c-1])
curoccur++;
else
{
if(curoccur>pivotoccur)
{
pivotoccur=curoccur;
pivotelem=inarray[c-1];
}
curoccur=1;
}
}
if(curoccur>pivotoccur)
{
pivotoccur=curoccur;
pivotelem=inarray[c-1];
}
return pivotelem;
}
int compFunction(const void * elem1, const void * elem2)
{
int int1=*((int *)elem1);
int int2=*((int *)elem2);
if (int1>int2) return 1;
else if (int2>int1) return -1;
else return 0;
}
L'algoritmo che ho scritto in primo luogo ordina l'array (richiamando qsort), così da compattare i valori in blocchi omogenei; quindi scorre l'array individuando il salto da un blocco all'altro, contando di quanti elementi consta ciascun blocco e confrontando tale valore con le occorrenze dell'elemento "pivot" (quello che, fino a questo momento, aveva il numero maggiore di occorrenze). Se l'ultimo blocco ha più occorrenze del pivot allora diventa il nuovo pivot; dopo aver scorso tutto l'array viene restituito il pivot.