Для тех, кому необычно нужна эта функция, есть метод категории в NSArray, который будет работать как с нечетным, так и с четным числом элементов:
МЕТОД КАТЕГОРИИ NSARRAY
- (float)median {
if (self.count == 1) return [self[0] floatValue];
float result = 0;
NSUInteger middle;
NSArray * sorted = [self sortedArrayUsingSelector:@selector(compare:)];
if (self.count % 2 != 0) { //odd number of members
middle = (sorted.count / 2);
result = [[sorted objectAtIndex:middle] floatValue];
}
else {
middle = (sorted.count / 2) - 1;
result = [[@[[sorted objectAtIndex:middle], [sorted objectAtIndex:middle + 1]] valueForKeyPath:@"@avg.self"] floatValue];
}
return result;
}
ТЕСТ
NSArray * singleElement = @[@1];
NSArray * oddNumberOfElements = @[@3, @5, @7, @12, @13, @14, @19, @20, @21, @22, @23, @29, @39, @40, @56];
NSArray * evenNumberOfElements = @[@3, @5, @7, @12, @13, @14, @19, @20, @21, @22, @23, @29, @40, @56];
NSLog(
@"oddNumberOfElements: %f, evenNumberOfElements: %f singleElement: %f",
[oddNumberOfElements median], [evenNumberOfElements median], [singleElement median]
);
//oddNumberOfElements: 20.000000, evenNumberOfElements: 19.500000 singleElement: 1.000000