Un primo metodo è quello che hai già citato, assegnare il valore minimo possibile alle caselle che contengono i massimi e calcolare il massimo k volte.
Un secondo metodo è effettuare un ordinamento parziale. Ad esempio applicare solo k volte il ciclo interno di un bubble sort, ciò porta i k massimi a posizionarsi all'inizio (o alla fine) dell'array. Oppure costruire una max heap.
In alternativa puoi mantenere un array ordinato di k elementi in cui inserisci gli elementi dell'array originario ad uno ad uno dimenticandoti quelli che strasbordano.
Tutte le soluzioni (assumendo che k << n) sono dominate da n.
La prima che è quella più simile al codice che hai proposto:
codice:#include <stdio.h> #include <limits.h> int massimo(int array[50],int n,int k); int main(void) { int array[50],i,n,max,k; printf("inserisci grandezza array:"); scanf("%d",&n); for(i=0; i<n; i++) { printf("inserisci elemento %d:",i+1); scanf("%d",&array[i]); } printf("inserisci k:"); scanf("%d",&k); max=massimo(array,n,k); printf("il %d massimo e' %d",k,max); return 0; } int massimo(int array[50],int n,int k) { int j, i, max, max_i; for(j = 0; j < k; ++j) { max = INT_MIN; for(i = 0; i < n; ++i) { if(array[i] > max) { max = array[i]; max_i = i; } } array[max_i] = INT_MIN; } return max; }

Rispondi quotando