数组的中位数

Median of an Array

大家好,我正在 Delphi 10 Seattle 开发。我实际上需要帮助来获取数组的中位数,例如:

 allitems: array[1..500] of Double;

我在程序中给出了数组中每个数组项的值。所以我得到了一个包含 500 个双精度值的数组,我想从这 500 个值中得到中位数。首先,我想我必须对数组从低值到高值进行排序,然后得到中位数。那么我怎样才能先对数组进行排序并在排序后得到中位数呢?

偶数个元素的中位数定义为中心元素的平均值:

var
  allitems : TArray<double>;

  TArray.Sort<double>(allitems);
  median := (allitems[249] + allitems[250]) / 2; // TArray<double> starts with index 0

您可以在 rosettacode.org 上找到的工作算法:

program AveragesMedian;

{$APPTYPE CONSOLE}

uses Generics.Collections, Types;

function Median(aArray: TDoubleDynArray): Double;
var
  lMiddleIndex: Integer;
begin
  TArray.Sort<Double>(aArray);

  lMiddleIndex := Length(aArray) div 2;
  if Odd(Length(aArray)) then
    Result := aArray[lMiddleIndex]
  else
    Result := (aArray[lMiddleIndex - 1] + aArray[lMiddleIndex]) / 2;
end;

begin
  Writeln(Median(TDoubleDynArray.Create(4.1, 5.6, 7.2, 1.7, 9.3, 4.4, 3.2)));
  Writeln(Median(TDoubleDynArray.Create(4.1, 7.2, 1.7, 9.3, 4.4, 3.2)));
end.