如何在 C# 中计算“五的中位数”?

2024-02-13

五的中位数有时被用作算法设计的练习,并且众所周知是可计算的仅使用 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

嗯,有人向我提出了这个问题 我的作业,我转向这个 论坛寻求帮助,但这里没有任何帮助。 我最终找到了该怎么做。

  1. 使用前 4 个元素开始合并排序,并对每对元素进行排序 (2 比较)

  2. 比较每对中较低的两个,并消除其中最低的一个 可能性(3个比较)

  3. 将预留的第 5 个数字与没有配对的数字相加并进行比较 两者(4个比较)

  4. 比较两个新对中最低的两个并消除较低的一个 (5个比较)

  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 次比较:]


我发现这篇文章很有趣,作为一个练习,我创建了这个,它只进行 6 次比较,没有其他任何内容:

static double MedianOfFive(double a, double b, double c, double d, double e)
{
    return b < a ? d < c ? b < d ? a < e ? a < d ? e < d ? e : d
                                                 : c < a ? c : a
                                         : e < d ? a < d ? a : d
                                                 : c < e ? c : e
                                 : c < e ? b < c ? a < c ? a : c
                                                 : e < b ? e : b
                                         : b < e ? a < e ? a : e
                                                 : c < b ? c : b
                         : b < c ? a < e ? a < c ? e < c ? e : c
                                                 : d < a ? d : a
                                         : e < c ? a < c ? a : c
                                                 : d < e ? d : e
                                 : d < e ? b < d ? a < d ? a : d
                                                 : e < b ? e : b
                                         : b < e ? a < e ? a : e
                                                 : d < b ? d : b
                 : d < c ? a < d ? b < e ? b < d ? e < d ? e : d
                                                 : c < b ? c : b
                                         : e < d ? b < d ? b : d
                                                 : c < e ? c : e
                                 : c < e ? a < c ? b < c ? b : c
                                                 : e < a ? e : a
                                         : a < e ? b < e ? b : e
                                                 : c < a ? c : a
                         : a < c ? b < e ? b < c ? e < c ? e : c
                                                 : d < b ? d : b
                                         : e < c ? b < c ? b : c
                                                 : d < e ? d : e
                                 : d < e ? a < d ? b < d ? b : d
                                                 : e < a ? e : a
                                         : a < e ? b < e ? b : e
                                                 : d < a ? d : a;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C# 中计算“五的中位数”? 的相关文章

随机推荐