Полагаю, вы можете определить n / 5 подмассивов по 5 элементов в каждом.
Найти медиану подмассива довольно просто: вы смотрите на каждый элемент и находите элемент, который имеет два меньших элемента.
Например, у вас есть 1 4 2 3 5. 1 не имеет меньших элементов. 4 имеет три меньших элемента. 2 имеет один меньший элемент. 3 имеет два меньших элемента; это тот, который вы хотите.
Теперь вы нашли n / 5 медиан. Вы хотите найти медиану медиан, поэтому снова запускаете алгоритм.
Пример:
1 7 2 4 9 0 3 8 5 6 1 4 7 2 3
[1 7 2 4 9] [0 3 8 5 6] [1 4 7 2 3]
findMedian ([1 7 2 4 9]) = 4;
findMedian ([0 3 8 5 6]) = 5;
findMedian ([1 4 7 2 3]) = 3;
[4 5 3]
findMedian ([4 5 3]) = 4;
4 - ваш стержень.
Причина, по которой вы делаете это, состоит в том, чтобы попытаться разделить массив равномерно; если ваш массив разбит на две части, вы получите производительность O (N ^ 2); если ваш массив разделен равномерно, вы получите производительность O (NlogN).
Выбор случайного поворота означает, что вы могли бы получить любой из них - на практике это сбалансировалось бы в O (NlogN), но многим приложениям нужна стабильная производительность, а случайная быстрая сортировка не согласована от запуска к запуску .
Причина, по которой мы используем 5 (вместо 3 или 7), заключается в том, что мы добавляем еще один критерий сложности времени при поиске медианы - этот термин должен быть меньше O (NlogN), но вы хотите, чтобы он был таким же маленьким насколько это возможно. При использовании 3 вы получаете O (N ^ 2), при использовании 5 вы получаете O (NlogN), а 5 - наименьшее число, для которого это верно.
(алгоритм нахождения медианы в линейном времени был дан Блюмом, Флойдом, Праттом, Ривестом и Тарьяном в их статье 1973 года «Границы времени для выбора» и ответил на известную открытую задачу)