В медиане трех вы смотрите на первый, средний и последний элементы массива и выбираете медиану этих трех элементов в качестве оси.
Чтобы получить «полный эффект» медианыиз трех, это также важно, чтобы рода эти три элемента, а не просто использовать медиану как стержень - это не влияет на то, что выбрано в качестве оси поворота в текущей итерации, но может / будет влиять на то, что используетсякак стержень в следующем рекурсивном вызове, который помогает ограничить плохое поведение для нескольких начальных упорядочений (во многих случаях, который оказывается особенно плохим, это отсортированный массив, за исключением наличия наименьшего элемента в верхнем концемассив (или самый большой элемент в нижнем конце). Например:
По сравнению со случайным выбором стержня:
- Это гарантирует, что один общий случай (полностью отсортированные данные) остается оптимальным.
- Сложнее манипулировать, чтобы выдать наихудший случай.
- ГСЧ часто бывает относительно медленным.
Этот второй пункт, вероятно, имеет немного больше объяснений.Если вы использовали очевидный (rand()
) генератор случайных чисел, то довольно легко (во всяком случае, во всяком случае) для кого-то расположить элементы так, что он будет постоянно выбирать плохие опорные точки.Это может быть серьезной проблемой для чего-то вроде веб-сервера, который может сортировать данные, введенные потенциальным злоумышленником, который может организовать атаку DoS, заставляя ваш сервер тратить много времени на сортировку данных.В таком случае вы могли бы использовать действительно случайное начальное число, или вы могли бы включить собственный PRNG вместо использования rand () - или вы использовали Median of three, что также имеет другие упомянутые преимущества.
С другой стороны, если вы используете достаточно случайный генератор (например, аппаратный генератор или шифрование в режиме счетчика), вероятно, на больше будет трудно форсировать плохое дело, чем длямедиана трех отборов.В то же время достижение этого уровня случайности обычно имеет свои собственные издержки, поэтому, если вы действительно не ожидаете нападения в этом случае, это, вероятно, не стоит (и если вы это сделаете, то, вероятно, стоит хотя бы рассмотретьальтернатива, которая гарантирует O (N log N) в худшем случае, например сортировка слиянием или сортировка кучи.