Я использую nth_element, чтобы получить (примерно правильное) значение для процентиля вектора, например, так:Почему std :: nth_element возвращает отсортированные векторы для входных векторов с N <33 элементами?
double percentile(std::vector<double> &vectorIn, double percent)
{
std::nth_element(vectorIn.begin(), vectorIn.begin() + (percent*vectorIn.size())/100, vectorIn.end());
return vectorIn[(percent*vectorIn.size())/100];
}
Я заметил, что vectorIn длиной до 32 элементов, вектор получает полностью отсортирован. Начиная с 33 элементов он никогда не сортируется (как и ожидалось).
Не уверен, что это имеет значение, но функция находится в «(Matlab-) mex C++ code», который скомпилирован через Matlab с помощью «Microsoft Windows SDK 7.1 (C++)».
РЕДАКТИРОВАТЬ:
см также следующую гистограмму длин самых длинных отсортированных блоков в 1e5 векторов, переданных функции (векторы содержали 1E4 случайных элементов и случайного процентиля рассчитывали). Обратите внимание на пик при очень малых значениях.
Функция делает частичный вид, чтобы вернуть значение запрошенного , Какая часть его частичной сортировки зависит от реализации. –
Нет, не связано с Мессе, но классный вопрос. – chappjc
Шип в левой части вашего сюжета очень похож на гистограмму длины самой длинной последовательной подпоследовательности в случайном векторе. Это может соответствовать малой доле случайно выбранных значений процентилей, так близких к концу вектора, что самая длинная подпоследовательность находится в той части вектора, которая никогда не касалась nth_vector. Но это всего лишь предположение. – rici