五的中位数有时被用作算法设计的练习,并且众所周知是可计算的仅使用 6 次比较.
实施这个的最好方法是什么“使用 6 次比较得出 5 的中位数”在 C# 中?我所有的尝试似乎都导致了尴尬的代码:(我需要漂亮且可读的代码,同时仍然只使用 6 次比较。
public double medianOfFive(double a, double b, double c, double d, double e){
//
// return median
//
return c;
}
Note:我想我也应该在这里提供“算法”:
我发现自己无法清楚地解释该算法Azereal在他的论坛帖子中做了。所以我会在这里引用他的帖子。从http://www.ocf.berkeley.edu/~wwu/cgi-bin/yabb/YaBB.cgi?board=riddles_cs;action=display;num=1061827085 http://www.ocf.berkeley.edu/~wwu/cgi-bin/yabb/YaBB.cgi?board=riddles_cs;action=display;num=1061827085
嗯,有人向我提出了这个问题
我的作业,我转向这个
论坛寻求帮助,但这里没有任何帮助。
我最终找到了该怎么做。
使用前 4 个元素开始合并排序,并对每对元素进行排序 (2
比较)
比较每对中较低的两个,并消除其中最低的一个
可能性(3个比较)
将预留的第 5 个数字与没有配对的数字相加并进行比较
两者(4个比较)
比较两个新对中最低的两个并消除较低的一个
(5个比较)
-
比较它本身和最后一对中较低的一个以及较低的一个
数字是中位数
可能的中位数在括号内
(54321)
5:4 3:2 2 比较
(4
4:2 3 比较
2(4
1:3 4 比较
2(4
4:1 5 比较
1,2(4
4:3 6 比较
1,2(3)4,5
三是中位数
这是我编写的用于查找 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;
}
它应该更紧凑,不是吗?
正如 @pablito 在他的回答中指出的那样,内置List.Sort()
无法满足此要求,因为它最多使用 13 次比较:]