Примечание: Пожалуйста, не интерпретируйте это как "домашнее задание". Это просто вещь, которую мне интересно знать:)
Медиана пяти иногда используется в качестве упражнения при разработке алгоритма и, как известно, вычисляется с использованием только 6 сравнений .
Каков наилучший способ реализации этой "медианы пяти с использованием 6 сравнений" в C #? Кажется, что все мои попытки приводят к неуклюжему коду :( Мне нужен хороший и читаемый код, хотя я все еще использую только 6 сравнений.
public double medianOfFive(double a, double b, double c, double d, double e){
//
// return median
//
return c;
}
Примечание: Я думаю, что я должен предоставить здесь и "алгоритм":
Я не смог четко объяснить алгоритм, как Azereal в своем посте на форуме. Поэтому я буду ссылаться на его пост здесь. От http://www.ocf.berkeley.edu/~wwu/cgi-bin/yabb/YaBB.cgi?board=riddles_cs;action=display;num=1061827085
Ну, я поставил эту проблему в одном
из моих заданий, и я обратился к этому
форум о помощи, но никакой помощи здесь не было.
В конце концов я узнал, как это сделать.
Запустите сортировку слиянием с первыми 4 элементами и закажите каждую пару (2
сравнения)
Сравните два нижних из каждой пары и исключите самый нижний из
возможности (3 сравнения)
Добавьте 5-е число, отведенное к номеру без пары, и сравните
два (4 сравнения)
Сравните две младшие из двух новых пар и исключите младшую
(5 сравнений)
Сравните единицу отдельно, младшую из последней пары и нижнюю
число является медианой
Возможная медиана находится в пределах
parentesis
* * Тысяча сорок-девять (54321)
5: 4 3: 2 2 сравнения
(4 <5 2 <3 1) </p>
4: 2 3 сравнения
2 (4 <5 3 1) </p>
1: 3 4 сравнения
2 (4 <5 1 <3) </p>
4: 1 5 сравнений
1,2 (4 <5 3) </p>
4: 3 6 сравнений
1,2 (3) 4,5
Три медиана
РЕДАКТИРОВАТЬ: В качестве вашего запроса и чтобы я не получил больше голосов, это код C ++, который я написал, чтобы найти медиану из пяти. Не против, это неловкость:
double StageGenerator::MedianOfFive(double n1, double n2, double n3, double n4, double n5){
double *a = &n1, *b = &n2, *c = &n3, *d = &n4, *e = &n5;
double *tmp;
// makes a < b and b < d
if(*b < *a){
tmp = a; a = b; b = tmp;
}
if(*d < *c){
tmp = c; c = d; d = tmp;
}
// eleminate the lowest
if(*c < *a){
tmp = b; b = d; d = tmp;
c = a;
}
// gets e in
a = e;
// makes a < b and b < d
if(*b < *a){
tmp = a; a = b; b = tmp;
}
// eliminate another lowest
// remaing: a,b,d
if(*a < *c){
tmp = b; b = d; d = tmp;
a = c;
}
if(*d < *a)
return *d;
else
return *a;
}
Это должно быть более компактно, не так ли?
EDIT:
Как указал @pablito в своем ответе. Встроенный List.Sort () не может выполнить это требование, поскольку он использует до 13 сравнений:]