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