2016-06-09 6 views
-1

Эй, ребята, я развиваюсь с Delphi 10 Seattle. И я на самом деле нужна помощь в получении медианы массива, например:Медиана массива

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

Я дал значение каждого arrayitem в массиве в порядке. Таким образом, я получил массив из 500 удвоений со значениями в нем и хочу получить медиану из этих 500 значений. Прежде всего, я предполагаю, что мне нужно отсортировать массив от низких до высоких значений и после получения медианы. Итак, как я могу отсортировать массив и получить медиану после сортировки?

+2

Вот ссылка на какой-то метод класса TArray. Это может помочь вам начать с сортировки: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/[email protected]_of_T.html –

+1

Возможно, эта страница Википедии также полезная: https://en.wikipedia.org/wiki/Selection_algorithm –

+0

Это не имеет никакого отношения к медианному значению. Ваш вопрос просто: «Как я могу отсортировать массив?» –

ответ

3

Срединная четного числа элементов определяется как среднее из центральных элементов:

var 
    allitems : TArray<double>; 

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

Спасибо за ответ! Я получаю, как вы получили медиану, но как вы сортируете массив или почему вы определяете массив new? Я просто определил свой массив, как в моем вопросе. И TArray.Sort не работает (необъявленный идентификатор TArray) –

+1

Включили ли вы «System.Generics.Collections», как указано ссылкой на документацию в комментариях к вашему вопросу? – DNR

+0

Возможно, вы используете какую-то древнюю версию Delphi @ Liam? –

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. 

 Смежные вопросы

  • Нет связанных вопросов^_^