Для расчета медианы пользуются таким правилом:
1. Ранжируются данные по убыванию.
2.1 Если количество данных нечетно, то медиана будет соответствовать центральному значению, номер которого можно определить по формуле:
iMe = (N + 1) / 2,
iMe - номер элемента в данных, соответствующий медиане;
где N - количество элементов в данных.
2.2 Если количество элементов в данных четно, то нужно брать среднюю арифметическую из двух центральных элементов данных:
iMe = (N / 2 + (N + 1) / 2) / 2.
Поскольку у нас массив начинается с нулевого номера, то нужно изменить формулs выше, т.е.
для нечетного случая:
iMe = (N +1) / 2 - 1, (1)
для четного случая:
Me = (N / 2 + (N / 2 - 1)) / 2 (2)
Проверим последние формулы.
1) Пусть у нас есть массив (ранжированный по убыванию):
i Y[i]
0 7
1 6
2 5
3 3
4 1
Количество элементов массива N = 5, т.е. нечетно. Значит медиана будет соответствовать значению массива с номером: (5 + 1) / 2 - 1 = 2, т.е. равна Y[2] = 5 (выделено жирным). Использована ф. (1).
2) Пусть у нас есть массив (ранжированный по убыванию):
i Y[i]
0 7
1 6
2 3
3 1
Количество элементов массива N = 4, т.е. четно. Значит медиана будет вычисляться как среднее арифметическое между двумя центральными значениями массива:
(Y[4 / 2] + Y[4 / 2 - 1]) / 2 = (3 + 6) / 2 = 4,5. Использована ф. (2).
Код функции по расчету медианы:
- Код: выделить все
double f_GetMed(double &Y[])
{
// Функция возвращает значение медианы в массиве
int size = ArraySize(Y);
// сортируем массив по убыванию
ArraySort(Y, WHOLE_ARRAY, 0, MODE_DESCEND);
if(size%2 == 0) return((Y[size / 2 - 1] + Y[size / 2]) / 2);
else return(Y[(size + 1) / 2 - 1]);
}
Массив передается по ссылке в качестве параметра в функцию f_GetMed. Сортируется по убыванию элементов. Далее проверяется если нацело на 2 делится кол-во элементов массива (т.е. их четное кол-во), то рассчитывается значение медианы для четного случая. Если кол-во элементов массива нечетное, то возвращается значение центрального номера массива.