Сортувати масив з 5 цілих чисел з максимумом 7 порівнянь


19

Як можна сортувати список з 5 цілих чисел таким чином, що в гіршому випадку він займає 7 порівнянь? Мені все одно, скільки інших операцій виконуються. Я не знаю нічого конкретного про цілі числа.

Я спробував декілька різних підходів до ділення та підкорення, які дозволяють мені знизитись до 8 порівнянь, таких як дотримання підходу до об'єднання або комбінування об'єднання з використанням двійкового пошуку, щоб знайти позицію вставки, але кожен раз, коли я підпадаю на 8 порівнянь, найгірший випадок .

Зараз я просто шукаю підказку, а не рішення.


Ви спробували написати дерево "порівняння"? У ньому листків, кожен відповідає перестановці цілих чисел. Якщо ви не знаєте, що я маю на увазі під «порівнянням» до дерева, чи знаєте ви докази того, що вам потрібно n log n порівнянь? Ps, що змушує тебе думати, що це можливо? 5!=120nlogn
Pål GD

1
Ну, 8-розрядний додаток - if(x > y)це те саме, if((x - y) & 0x80)що навряд чи можна порівняти. Я думаю, ми повинні забути, що об’єкти цілі числа, і припустимо, що ми повинні використовувати якусь магічну compare(x, y)функцію для порівняння цих об'єктів ...
Karolis Juodelė

2
Чи вважається «підказкою чи рішенням розділ 5.3 щодо оптимального сортування в Томі 3« Програми комп’ютерного програмування » , який охоплює саме це питання? :-)
Стівен Стадницький

3
Межа насправді , і 5 ! = 120 < 2 7 = 128 . Так що це можливо (в принципі). 2cn!5!=120<27=128
vonbrand

Відповіді:


23

Є лише один спосіб розпочати цей процес (і майже для всіх ваших рішень того, з чим порівнювати на наступних етапах, існує лише один правильний). Ось як це розібратися. По-перше, зауважте, що для ваших порівнянь можна отримати можливих відповідей, і 5 ! = 120 різних перестановок, які вам потрібно розрізняти.27=1285!=120

Перше порівняння просте: ви повинні порівняти два клавіші, і оскільки ви нічого не знаєте про них, всі варіанти однаково хороші. Тож скажімо, ви порівнюєте і b і знаходимо, що a b . Тепер у вас залишилось 2 6 = 64 можливих відповіді, і залишилося 60 можливих перестановок (оскільки ми усунули половину з них).abab26=6460

Далі ми можемо порівняти і d , або порівняти c з одним із ключів, які ми використовували в першому порівнянні. Якщо ми порівняємо c і d і дізнаємося, що c d , то у нас є 32 відповіді, що залишилися, і 30 можливих перестановок. З іншого боку, якщо ми порівняємо гр зcdccdcd3230c, і ми виявилищоC , ми маємо 40 можливих перестановок залишилися, тому що ми виключили 1 / 3 з можливих перестановок (ті, з aac401/3 ). У нас є лише 32 можливі відповіді, тому нам не пощастило.cab32

Отже, тепер ми знаємо, що нам потрібно порівняти перший і другий ключі, третій і четвертий ключі. Можна припустити , що ми маємо і C d . Якщо ми порівняємо е з будь-якого з цих чотирьох ключів, з тих самих міркувань ми використовували в попередньому кроці, ми могли б усунути тільки +1 / 3 з перестановок інших, і ми не пощастило. Отже, ми повинні порівняти два ключі a , babcde1/3 . Беручи до уваги симетрію, ми маємо два варіанти, порівняємо a і c або порівняємо a і da,b,c,dacad. Аналогічний аргумент підрахунку показує, що ми повинні порівняти і c . Можна вважати , не обмежуючи спільності , що C , і тепер ми маємо в б і в гр д .acacabacd

Оскільки ви попросили підказку, я не буду перебирати решту аргументів. У вас залишилось чотири порівняння. Використовуйте їх розумно.


Як ви , що порівняння доa зводить вас лише до 40 перестановок? c
Роберт С. Барнс

1
@Robert: Припустимо , що у вас є і гр . Тоді є дві перестановки a , b , c, що відповідають цим обмеженням, a < b < c і a < c < b . Для кожної з цих двох перестановок є чотири місця, до яких можна додати d, і п’ять місць, які ви можете додати e . abaca,b,ca<b<ca<c<bde
Пітер Шор

8

Ви можете знайти це в «Мистецтві комп’ютерного програмування» т. III, Д.Кнут, але стратегія така (я припускаю, у вас є масив ): Якщо ви хочете прочитати підказку лише перші два рядки моєї відповіді{a,b,c,d,e}

  • Перші групові пари чисел: .(a,b),(c,d)
  • Порівняйте пари, щоб сортувати їх, наприклад: .a<b,c<d
  • Порівнявши найменші елементи пар, отримаємо результат, наприклад, .a<c
  • Порівняйте останній елемент із більшим елементом в останньому порівнянні ( c ) ec
    • Якщо , легко в кінцевому підсумку з порівнянням, що залишилися 3. Готово.e<c
    • Якщо то слід сортувати { b , c , d , e } зі знанням c < ee>c{b,c,d,e} . c<e,c<d
      • , якщоCompare(d,e) тоді d<e
        • , якщоCompare(b,d)b>d
          • . Готово.Compare(b,e)
        • якщо b<d
          • . Готово.Compare(b,c)
      • якщо d>e
        • якщоCompare(b,e)b>e
          • . Готово.Compare(b,d)
        • якщо b<e
          • Compare(b,c) . Готово.

Всі вищезазначені способи є причиною, щонайменше, трьох порівнянь після першого порівняння зe . (максимум означає 7). c


Ви впевнені, що це правильно? Припустимо, ви отримаєте такі результати: a <b, c <d, a <c, а потім c <e, b <e, c <b і d <e. Порядки a <c <b <d <e та a <c <d <b <e обидва відповідають їм. Причина полягає в тому, що b і d ніколи не порівнюються, неявно або явно. Можливо, я десь помиляюся, якщо так, будь ласка, виправте мене.
Джордж
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.