Ecco una soluzione che non usa nessun array aggiuntivo, così siamo tutti più contenti:
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.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; }

Rispondi quotando