#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int min(int a, int b){
return a > b ? b : a;
}
// Função de comparação usada pelo qsort
int cmpfunc (const void * a, const void * b)
{
if (*(double*)a > *(double*)b)
return 1;
else if (*(double*)a < *(double*)b)
return -1;
else
return 0;
}
// Calcula a mediana de um vetor de tamanho <= 5 em O(1)
double findMedian(double vec[], int n){
double median;
// ordenação com QuickSort
qsort(vec
, n
, sizeof(double), cmpfunc
); median = vec[(n/2)];
return median;
}
// Encontra a mediana aproximada do vetor em O(n)
double findMedianOfMedians(double vec[], int n){
int sizeMedians
= ceil(n
/5.0); double medians[sizeMedians];
if(n == 0) return 0.0;
if(n == 1) return vec[0];
if(n == 2) return (vec[0] + vec[1])/2;
int count = 0;
int countMedians = 0;
while (count < n) {
int countRow = 0;
int size = min(5, n - count);
double row[size];
while ((countRow < 5) && (count < n)) {
row[countRow] = (vec[count]);
count++;
countRow++;
}
double m = findMedian(row, size);
medians[countMedians++] = m;
}
return findMedianOfMedians(medians, sizeMedians);
}
int main(void) {
//Calcular a mediana aproximada do vetor a seguir.
//O algoritmo nem sempre encontra a exata, mas encontra um valor próximo (o que já é suficiente)
double vec[] = {8615, 11916, 16355, 12755, 15219, 11364, 9739, 13373, 3151, 3500, 8566, 15285, 6617, 16484, 13096, 5947, 11737, 5067, 14165, 3569, 14263, 14288, 2728, 15063, 10913, 3163, 9893, 13660, 3026, 18147, 10743, 8019, 3565, 13810, 10111, 12865, 12077, 3696, 18201, 10430, 11542, 8936, 15773, 7915, 16064};
double median = findMedianOfMedians(vec, 45);
printf("Median: %.2lf\n", median
);
int menoresIguais = 0, maiores = 0;
for(int i=0; i<45; i++){
if(vec[i] < median){
menoresIguais++;
} else{
maiores++;
}
}
printf("Quantidade de menores ou iguals que a mediana: %d.\nQuantidade de maiores que a mediana: %d.\n", menoresIguais
, maiores
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCgppbnQgbWluKGludCBhLCBpbnQgYil7CglyZXR1cm4gYSA+IGIgPyBiIDogYTsKfQoKLy8gRnVuw6fDo28gZGUgY29tcGFyYcOnw6NvIHVzYWRhIHBlbG8gcXNvcnQgCmludCBjbXBmdW5jIChjb25zdCB2b2lkICogYSwgY29uc3Qgdm9pZCAqIGIpCnsKICBpZiAoKihkb3VibGUqKWEgPiAqKGRvdWJsZSopYikKICAgIHJldHVybiAxOwogIGVsc2UgaWYgKCooZG91YmxlKilhIDwgKihkb3VibGUqKWIpCiAgICByZXR1cm4gLTE7CiAgZWxzZQogICAgcmV0dXJuIDA7ICAKfSAKCi8vIENhbGN1bGEgYSBtZWRpYW5hIGRlIHVtIHZldG9yIGRlIHRhbWFuaG8gPD0gNSBlbSBPKDEpCmRvdWJsZSBmaW5kTWVkaWFuKGRvdWJsZSB2ZWNbXSwgaW50IG4pewogICAgZG91YmxlIG1lZGlhbjsKICAgIC8vIG9yZGVuYcOnw6NvIGNvbSBRdWlja1NvcnQKCXFzb3J0KHZlYywgbiwgc2l6ZW9mKGRvdWJsZSksIGNtcGZ1bmMpOwogICAgbWVkaWFuID0gdmVjWyhuLzIpXTsKICAgIHJldHVybiBtZWRpYW47Cn0KCi8vIEVuY29udHJhIGEgbWVkaWFuYSBhcHJveGltYWRhIGRvIHZldG9yIGVtIE8obikKZG91YmxlIGZpbmRNZWRpYW5PZk1lZGlhbnMoZG91YmxlIHZlY1tdLCBpbnQgbil7CglpbnQgc2l6ZU1lZGlhbnMgPSBjZWlsKG4vNS4wKTsKICAgIGRvdWJsZSBtZWRpYW5zW3NpemVNZWRpYW5zXTsgCgogICAgaWYobiA9PSAwKSByZXR1cm4gMC4wOwogICAgaWYobiA9PSAxKSByZXR1cm4gdmVjWzBdOwogICAgaWYobiA9PSAyKSByZXR1cm4gKHZlY1swXSArIHZlY1sxXSkvMjsKCiAgICBpbnQgY291bnQgPSAwOwogICAgaW50IGNvdW50TWVkaWFucyA9IDA7CiAgICB3aGlsZSAoY291bnQgPCBuKSB7ICAgIAogICAgICAgIGludCBjb3VudFJvdyA9IDA7CiAgICAgICAgaW50IHNpemUgPSBtaW4oNSwgbiAtIGNvdW50KTsKICAgICAgICBkb3VibGUgcm93W3NpemVdOwoKICAgICAgICB3aGlsZSAoKGNvdW50Um93IDwgNSkgJiYgKGNvdW50IDwgbikpIHsKICAgICAgICAgICAgcm93W2NvdW50Um93XSA9ICh2ZWNbY291bnRdKTsKICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgY291bnRSb3crKzsKICAgICAgICB9CgogICAgICAgIGRvdWJsZSBtID0gZmluZE1lZGlhbihyb3csIHNpemUpOwogICAgICAgIG1lZGlhbnNbY291bnRNZWRpYW5zKytdID0gbTsKICAgIH0KCiAgICByZXR1cm4gZmluZE1lZGlhbk9mTWVkaWFucyhtZWRpYW5zLCBzaXplTWVkaWFucyk7Cn0KCmludCBtYWluKHZvaWQpIHsKCQoJLy9DYWxjdWxhciBhIG1lZGlhbmEgYXByb3hpbWFkYSBkbyB2ZXRvciBhIHNlZ3Vpci4gCgkvL08gYWxnb3JpdG1vIG5lbSBzZW1wcmUgZW5jb250cmEgYSBleGF0YSwgbWFzIGVuY29udHJhIHVtIHZhbG9yIHByw7N4aW1vIChvIHF1ZSBqw6Egw6kgc3VmaWNpZW50ZSkKCWRvdWJsZSB2ZWNbXSA9IHs4NjE1LCAxMTkxNiwgMTYzNTUsIDEyNzU1LCAxNTIxOSwgMTEzNjQsIDk3MzksIDEzMzczLCAzMTUxLCAzNTAwLCA4NTY2LCAxNTI4NSwgNjYxNywgMTY0ODQsIDEzMDk2LCA1OTQ3LCAxMTczNywgNTA2NywgMTQxNjUsIDM1NjksIDE0MjYzLCAxNDI4OCwgMjcyOCwgMTUwNjMsIDEwOTEzLCAzMTYzLCA5ODkzLCAxMzY2MCwgMzAyNiwgMTgxNDcsIDEwNzQzLCA4MDE5LCAzNTY1LCAxMzgxMCwgMTAxMTEsIDEyODY1LCAxMjA3NywgMzY5NiwgMTgyMDEsIDEwNDMwLCAxMTU0MiwgODkzNiwgMTU3NzMsIDc5MTUsIDE2MDY0fTsKCQoJZG91YmxlIG1lZGlhbiA9IGZpbmRNZWRpYW5PZk1lZGlhbnModmVjLCA0NSk7CgkKCXByaW50ZigiTWVkaWFuOiAlLjJsZlxuIiwgbWVkaWFuKTsKCQoJaW50IG1lbm9yZXNJZ3VhaXMgPSAwLCBtYWlvcmVzID0gMDsKCQoJZm9yKGludCBpPTA7IGk8NDU7IGkrKyl7CgkJaWYodmVjW2ldIDwgbWVkaWFuKXsKCQkJbWVub3Jlc0lndWFpcysrOwoJCX0gZWxzZXsKCQkJbWFpb3JlcysrOwkKCQl9Cgl9CgkKCXByaW50ZigiUXVhbnRpZGFkZSBkZSBtZW5vcmVzIG91IGlndWFscyBxdWUgYSBtZWRpYW5hOiAlZC5cblF1YW50aWRhZGUgZGUgbWFpb3JlcyBxdWUgYSBtZWRpYW5hOiAlZC5cbiIsIG1lbm9yZXNJZ3VhaXMsIG1haW9yZXMpOwoJCglyZXR1cm4gMDsKfQo=