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