Как отсортировать список из 5 целых чисел, чтобы в худшем случае потребовалось 7 сравнений? Мне все равно, сколько других операций выполняется. Я не знаю ничего конкретного о целых числах.
Я пробовал несколько разных подходов «разделяй и властвуй», которые сводят меня к 8 сравнениям, например, следуя подходу сортировки слиянием или комбинируя сортировку слиянием с использованием бинарного поиска, чтобы найти позицию вставки, но каждый раз, когда я получаю 8, сравнивает наихудший случай ,
Сейчас я просто ищу подсказку, а не решение.
algorithms
sorting
Роберт С. Барнс
источник
источник
if(x > y)
это то же самое,if((x - y) & 0x80)
что вряд ли можно сравнить. Я предполагаю, что мы должны забыть, что объекты являются целыми числами, и предположить, что мы должны использовать некоторую магическуюcompare(x, y)
функцию для сравнения этих объектов ...Ответы:
Есть только один способ начать этот процесс (и почти для всех ваших решений о том, что сравнивать на последующих шагах, есть только один правильный). Вот как это понять. Во-первых, обратите внимание, что для сравнения можно получить возможных ответов, и различных перестановок, которые вы должны различать.5 ! = 12027=128 5!=120
Первое сравнение легко: вам нужно сравнить два ключа, и, поскольку вы ничего о них не знаете, все варианты одинаково хороши. Допустим, вы сравниваете и и обнаруживаете, что . Теперь у вас осталось возможных ответов и осталось возможных перестановок (поскольку мы исключили половину из них).b a ≤ b 2 6 = 64 60a b a≤b 26=64 60
Затем мы можем либо сравнить и , либо сравнить с одним из ключей, которые мы использовали в первом сравнении. Если мы сравним и и узнаем, что , то у нас есть оставшихся ответа и возможных перестановок. С другой стороны, если мы сравнимd c c d c ≤ d 32 30 cc d c c d c≤d 32 30 c с , и мы обнаружили , что ≤ C , мы имеем 40 возможных перестановок оставшихся, потому что мы исключили 1 / 3 из возможных перестановок (те, с ≤a a≤c 40 1/3 ). У нас есть только 32 возможных оставшихся ответов, поэтому нам не повезло.c≤a≤b 32
Итак, теперь мы знаем, что нам нужно сравнить первый и второй ключи, а также третий и четвертый ключи. Можно предположить, что у нас и c ≤ d . Если мы сравним е с любого из этих четырех ключей, по тем же соображениям мы использовали в предыдущем шаге, мы могли бы устранить только +1 / 3 из перестановок остальных, и мы не повезло. Таким образом, мы должны сравнить два ключа a , b , c , d . С учетом симметрии у нас есть два варианта: сравнить a и c или сравнить a и da≤b c≤d e 1/3 a,b,c,d a c a d , Аналогичный аргумент подсчета показывает, что мы должны сравнить и c . Мы можем предположить без ограничения общности, что a ≤ c , и теперь мы имеем a ≤ b и a ≤ c ≤ d .a c a≤c a≤b a≤c≤d
Так как вы попросили подсказку, я не буду разбираться с остальными аргументами. У вас осталось четыре сравнения. Используйте их с умом.
источник
Вы можете найти это в книге «Искусство компьютерного программирования», том III, автор D.Knuth, но стратегия такова (я предполагаю, что у вас есть массив ): если вы хотите прочитать подсказку только первые две строки моего ответа{a,b,c,d,e}
Все вышеперечисленные способы являются причиной не более трех сравнений после первого сравнения с c . (означает не более 7).e c
источник