Masuk akal bagi saya bahwa ini membuatnya lebih cepat untuk menyelesaikan masalah jika kedua belah pihak membutuhkan waktu kurang dari setengah pekerjaan berurusan dengan seluruh kumpulan data.
Itu bukan inti dari algoritma divide-and-conquer. Biasanya intinya adalah bahwa algoritma tidak dapat "menangani seluruh set data" sama sekali. Alih-alih, itu dibagi menjadi beberapa bagian yang sepele untuk dipecahkan (seperti menyortir dua angka), kemudian dipecahkan secara sepele dan hasilnya digabungkan dengan cara yang menghasilkan solusi untuk set data lengkap.
Tetapi mengapa tidak membagi kumpulan data menjadi tiga bagian? Empat? n?
Terutama karena membaginya menjadi lebih dari dua bagian dan menggabungkan kembali lebih dari dua hasil menghasilkan implementasi yang lebih kompleks tetapi tidak mengubah karakteristik fundamental (Big O) dari algoritma - perbedaannya adalah faktor konstan, dan dapat mengakibatkan perlambatan jika pembagian dan rekombinasi lebih dari 2 himpunan bagian menciptakan overhead tambahan.
Misalnya, jika Anda melakukan semacam penggabungan 3 arah, maka pada fase rekombinasi Anda sekarang harus menemukan yang terbesar dari 3 elemen untuk setiap elemen, yang membutuhkan 2 perbandingan, bukan 1, sehingga Anda akan melakukan dua kali lebih banyak perbandingan secara keseluruhan . Sebagai gantinya, Anda mengurangi kedalaman rekursi dengan faktor ln (2) / ln (3) == 0,63, sehingga Anda memiliki swap lebih sedikit 37%, tetapi 2 * 0,63 == perbandingan 26% lebih banyak (dan akses memori). Apakah itu baik atau buruk tergantung pada mana yang lebih mahal di perangkat keras Anda.
Saya juga telah melihat banyak referensi untuk quicksort 3-arah. Kapan ini lebih cepat?
Rupanya varian dual pivot quicksort dapat dibuktikan membutuhkan jumlah perbandingan yang sama tetapi rata-rata 20% lebih sedikit swap, jadi ini merupakan keuntungan bersih.
Apa yang digunakan dalam praktik?
Dewasa ini hampir tidak ada orang yang memprogram algoritma sorting mereka sendiri lagi; mereka menggunakan satu yang disediakan oleh perpustakaan. Sebagai contoh, Java 7 API sebenarnya menggunakan quicksort dual-pivot.
Orang-orang yang benar-benar memprogram algoritma pengurutan mereka sendiri untuk beberapa alasan akan cenderung tetap berpegang pada varian 2-arah yang sederhana karena lebih sedikit potensi kesalahan mengalahkan kinerja 20% lebih baik sebagian besar waktu. Ingat: sejauh ini peningkatan kinerja yang paling penting adalah ketika kode beralih dari "tidak bekerja" menjadi "bekerja".