Implementácie

Vyhµadávanie k-tej hodnoty

 
 
//najdenie zadanej (k-tej najmensej) hodnoty v poli "pole" 
//so zadanym poctom prvkov "velkost"
//funkcia vracia zadanu hodnotu v poli 
//ak je v poli menej prvkov ako k, funkcia vracia maximum
//ak je k <= 0, funkcia vracia minimum
int najdi_k_tu_hodnotu2(int* pole, int velkost, int k){
	int lavy_o=0;
	int pravy_o=velkost-1;
	int Q;

	while(lavy_o!=pravy_o) {
		triedenie(pole, lavy_o, pravy_o, Q);
		int M=Q-lavy_o+1;
		if (k <= M) pravy_o=Q;
		else {
			lavy_o=Q+1;
			k=k-M;
		}
	}
	return pole[lavy_o];
}

//pomocna funkcia na ciastocne triedenie pola "pole" 
//medzi zadanym lavym "lavy_o" a pravym "pravy_o" okrajom 
//prvky s mensim indexom ako Q su po ukonceni funkcie mensie alebo rovne ako pivot
//prvky s vacsim indexom ako Q su po ukonceni funkcie vacsie alebo rovne ako pivot
//pocet prvkov mensich alebo rovnych ako pivot je ulozeny na adresu &Q
void triedenie(int* pole, int lavy_o, int pravy_o, int& Q){
	int i=lavy_o;
	int j=pravy_o;
	int pivot=pole[(lavy_o+pravy_o)/2];

	do {
		while (pole[i] < pivot) i++;
		while (pole[j] > pivot) j--;
		if (i <= j) {
			int pomocna;
			pomocna=pole[i]; pole[i]=pole[j]; pole[j]=pomocna;		
			i++; j--;
		}
	} while (i <= j);
	Q=i-1;
}
 
//najdenie zadanej (k-tej najmensej) hodnoty v poli "pole" 
//medzi lavym "lavy_o" a pravym "pravy_o" okrajom
//pre vyhladavanie v celom poli treba zadat lavy_o=0 a pravy_o=velkost-1
//funkcia vracia zadanu hodnotu v poli 
//ak je v poli menej prvkov ako k, funkcia vracia maximum
//ak je k <= 0, funkcia vracia minimum
int najdi_k_tu_hodnotu(int* pole, int lavy_o, int pravy_o, int k){
	int M, Q;
	if (lavy_o==pravy_o) return pole[lavy_o];
	else {
		triedenie(pole, lavy_o, pravy_o, Q);
		M=Q-lavy_o+1;
		if (k <= M) najdi_k_tu_hodnotu(pole, lavy_o, Q, k);
		else najdi_k_tu_hodnotu(pole, Q+1, pravy_o, k-M);
	}
}

//pomocna funkcia na ciastocne triedenie pola "pole" 
//medzi zadanym lavym "lavy_o" a pravym "pravy_o" okrajom 
//prvky s mensim indexom ako Q su po ukonceni funkcie mensie alebo rovne ako pivot
//prvky s vacsim indexom ako Q su po ukonceni funkcie vacsie alebo rovne ako pivot
//pocet prvkov mensich alebo rovnych ako pivot je ulozeny na adresu &Q
void triedenie(int* pole, int lavy_o, int pravy_o, int& Q){
	int i=lavy_o;
	int j=pravy_o;
	int pivot=pole[(lavy_o+pravy_o)/2];

	do {
		while (pole[i] < pivot) i++;
		while (pole[j] > pivot) j--;
		if (i <= j) {
			int pomocna;
			pomocna=pole[i]; pole[i]=pole[j]; pole[j]=pomocna;		
			i++; j--;
		}
	} while (i <= j);
	Q=i-1;
}