Медиана медиан, понимающих код
Я нашел реализацию алгоритма в C++ здесь https://gist.github.com/andlima/1774060 но я не понимаю цели нескольких строк и как они работают,
- Должен ли я добавить оператор if, что если n меньше определенного количества, мы должны просто отсортировать массив и вернуть v[k]?
- В 4-й строке, почему мы создаем переменную, увеличивая ее на 4? Я понимаю, что мы должны разделить это на 5, чтобы иметь количество маленьких массивов
- За что отвечает этот цикл for в 6 строке? Это для разделения основного массива на более мелкие, которые мы хотим отсортировать, а затем создать массив медиан? Почему существует функция подкачки и почему мы разделяем ее на условия if и else?
- Почему мы удаляем массив medians после вызова той же строки функции перед
- Какова цель цикла в 25 строк и это в 33, а также своп в 38?
Я буду очень благодарен за любую помощь с этим.
1 ответ
Решение
- Это оптимизация. Реализация может сделать это, но это не обязательно.
- Добавление четырех делается для округления результата деления на пять. Это обычная уловка с целочисленным делением: если вы хотите округлить результат деления на
N
, добавлятьN-1
до разделения. - Цикл в строке 6 отвечает за итерацию пятиэлементных фрагментов массива.
if
условие проверяет, имеет ли кусок пять элементов.for
циклы внутри выполняют сортировку выбора, меняя местами элементы, чтобы поместить медиану в индексw[2]
- Мы удаляем
medians
как только закончится рекурсивный вызов, потому что остальной части алгоритма это не нужно. - Петля на линии 25 ходов
pivot
в конечную позицию массива.