所以我很难让这件作品输出一个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]);
这项工作是我计算课程中的一项扩展任务,所以我可能已经采取了完全错误的方法来完成这项任务。 提前致谢
答案 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);
上查看它
答案 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,因为数组索引从零开始。