如何算出C#的中位数

时间:2017-10-09 23:13:53

标签: c# numbers median

所以我很难让这件作品输出一个4值的中值。 输出产生一个高于实际中间值的值,即使我将2更改为2.0,我似乎也无法输出小数。我可以让它输出一个带有3个数字的值,但是没有用4来实现它。

    Console.Write("Median Value: ");
    var items = new[]{num1, num2, num3, num4 };
    Array.Sort(items);
    Console.WriteLine(items[items.Length/2]);

这项工作是我计算课程中的一项扩展任务,所以我可能已经采取了完全错误的方法来完成这项任务。 提前致谢

2 个答案:

答案 0 :(得分:0)

public decimal GetMedian(int[] array)
{
    int[] tempArray = array;
    int count = tempArray.Length;

    Array.Sort(tempArray);

    decimal medianValue = 0;

    if (count % 2 == 0)
    {
        // count is even, need to get the middle two elements, add them together, then divide by 2
        int middleElement1 = tempArray[(count / 2) - 1];
        int middleElement2 = tempArray[(count / 2)];
        medianValue = (middleElement1 + middleElement2) / 2;
    }
    else
    {
        // count is odd, simply get the middle element.
        medianValue = tempArray[(count / 2)];
    }

    return medianValue;
}

您的实现适用于奇数大小的集合。但是当处理偶数大小的集合时,你找到中间的数字对,然后找到它们之间的中间值(简单的算术平均值)。这可以通过将它们加在一起并除以2来轻松完成。

根据您的代码调用方法:

Console.Write("Median Value: ");
int[] items = new int[] {num1, num2, num3, num4};
var median = GetMedian(items);
Console.WriteLine(median);

Ideone.

上查看它

答案 1 :(得分:0)

如果你看一下Wikipedia中的解释,那很简单:

简单解释样本中位数

在个别系列中(如果观察次数非常低),首先必须按顺序排列所有观察结果。

然后count(n)是给定数据中的观察总数。

如果n为奇数,则中位数(M)=((n + 1)/ 2)项项的值。

如果n是偶数,那么中位数(M)= [(n / 2)项项+ +(n / 2 + 1)项项的值] / 2。

这如何转化为代码?

using System;

namespace ConsoleApp1
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            var array = new[] {1, 2, 3, 4};

            Array.Sort(array);

            var n = array.Length;

            double median;

            var isOdd = n % 2 != 0;
            if (isOdd)
            {
                median = array[(n + 1) / 2 - 1];
            }
            else
            {
                median = (array[n / 2 - 1] + array[n / 2]) / 2.0d;
            }

            Console.WriteLine(median);
        }
    }
}

请注意,在获取数组中元素的值时必须减1,因为数组索引从零开始。