Bagaimana saya bisa mengurutkan daftar 5 bilangan bulat sehingga dalam kasus terburuk dibutuhkan 7 perbandingan? Saya tidak peduli berapa banyak operasi lain yang dilakukan. Saya tidak tahu apa-apa tentang bilangan bulat.
Saya telah mencoba beberapa pendekatan membagi dan menaklukkan yang membuat saya turun ke 8 perbandingan, seperti mengikuti pendekatan mergesort, atau menggabungkan mergesort dengan menggunakan pencarian biner untuk menemukan posisi penyisipan, tetapi setiap kali saya berakhir dengan 8 membandingkan kasus terburuk .
Saat ini saya hanya mencari petunjuk, bukan solusi.
algorithms
sorting
Robert S. Barnes
sumber
sumber
if(x > y)
adalah sama denganif((x - y) & 0x80)
yang hampir tidak bisa dibandingkan. Saya kira kita harus lupa bahwa benda-benda itu bilangan bulat dan menganggap kita harus menggunakan beberapacompare(x, y)
fungsi magis untuk membandingkan benda-benda itu ...Jawaban:
Hanya ada satu cara untuk memulai proses ini (dan untuk hampir semua keputusan Anda tentang apa yang akan dibandingkan dalam langkah-langkah selanjutnya, hanya ada satu yang benar). Inilah cara mengatasinya. Pertama, perhatikan bahwa ada kemungkinan jawaban yang bisa Anda dapatkan untuk perbandingan, dan 5 ! = 120 permutasi berbeda yang perlu Anda bedakan.27=128 5!=120
Perbandingan pertama itu mudah: Anda harus membandingkan dua kunci, dan karena Anda tidak tahu apa-apa tentang itu, semua pilihan sama baiknya. Jadi katakanlah Anda membandingkan dan b , dan menemukan bahwa sebuah ≤ b . Anda sekarang memiliki 2 6 = 64 kemungkinan jawaban tersisa, dan 60 kemungkinan permutasi tersisa (karena kami telah menghilangkan setengah dari mereka).a b a≤b 26=64 60
Selanjutnya, kita dapat membandingkan dan d , atau kita dapat membandingkan c dengan salah satu kunci yang kita gunakan dalam perbandingan pertama. Jika kita membandingkan c dan d , dan belajar itu c ≤ d , maka kita memiliki 32 jawaban yang tersisa dan 30 kemungkinan permutasi. Di sisi lain, jika kita membandingkan c dengan sebuah , dan kami menemukan bahwa sebuah ≤ c , kami memiliki 40 kemungkinan permutasi yang tersisa, karena kita telah dieliminasi 1 / 3 dari kemungkinan permutasi (orang-orang dengan c ≤c d c c d c≤d 32 30 c a a≤c 40 1/3 ). Kami hanya memiliki 32 kemungkinan jawaban yang tersisa, jadi kami kurang beruntung.c≤a≤b 32
Jadi sekarang kita tahu bahwa kita harus membandingkan kunci pertama dan kedua, dan kunci ketiga dan keempat. Kita bisa berasumsi bahwa kita memiliki dan c ≤ d . Jika kita membandingkan e ke salah satu dari empat tombol ini, dengan argumen yang sama kita gunakan pada langkah sebelumnya, kita mungkin hanya menghilangkan 1 / 3 dari permutasi yang tersisa, dan kami beruntung. Jadi kita harus membandingkan dua kunci a , b , c , d . Dengan mempertimbangkan simetri akun, kami memiliki dua pilihan, membandingkan a dan c atau membandingkan a dan da≤b c≤d e 1/3 a,b,c,d a c a d . Argumen penghitungan serupa menunjukkan bahwa kita harus membandingkan dan c . Kita dapat mengasumsikan tanpa kehilangan umum bahwa sebuah ≤ c , dan sekarang kami memiliki sebuah ≤ b dan a ≤ c ≤ d .a c a≤c a≤b a≤c≤d
Karena Anda meminta petunjuk, saya tidak akan membahas seluruh argumen. Anda memiliki empat perbandingan tersisa. Gunakan dengan bijak.
sumber
Anda dapat menemukan ini di The Art of Computer Programming vol III, oleh D.Knuth, tetapi strateginya seperti ini (saya akan menganggap Anda memiliki array ): Jika Anda ingin petunjuk membaca hanya dua baris pertama jawaban saya{a,b,c,d,e}
Semua cara yang disebutkan di atas menyebabkan paling banyak tiga perbandingan setelah perbandingan pertama dengan c . (Berarti paling banyak 7).e c
sumber