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;
}