Saya mengalami kesulitan menemukan sumber daya yang baik yang memberikan kasus terburuk di tempat algoritma penyortiran stabil . Adakah yang tahu sumber daya yang bagus?
Hanya pengingat, di tempat berarti menggunakan array yang diteruskan dan algoritma pengurutan hanya diperbolehkan untuk menggunakan ruang ekstra konstan. Stabil berarti bahwa elemen dengan kunci yang sama muncul dalam urutan yang sama dalam array yang diurutkan seperti yang mereka lakukan pada aslinya.
Misalnya, semacam gabungan naif adalah kasus terburuk dan stabil tetapi menggunakan ruang ekstra. Quicksort standar dapat dibuat stabil, sudah ada tetapi kasus terburuk . Heapsort sudah ada, kasus terburuk tetapi tidak stabil. Wikipedia memiliki bagan yang bagus tentang algoritma pengurutan yang memiliki kekurangan. Perhatikan bahwa tidak ada algoritma penyortiran yang mereka daftarkan yang memiliki ketiga kondisi stabilitas, kasus terburuk dan berada di tempat.
Saya telah menemukan sebuah makalah yang disebut "Praktis di tempat mergesort" oleh Katajainen, Pasanen dan Teuhola, yang mengklaim memiliki kasus terburuk di tempat varian mergesort stabil. Jika saya memahami hasil mereka dengan benar, mereka menggunakan (bottom-up?) Mergesort secara rekursif pada dari array dan yang terakhir dari array dan menggunakan yang kedua sebagai ruang awal untuk melakukan penggabungan. Saya masih membaca ini sehingga informasi lebih lanjut tentang apakah saya menafsirkan hasil mereka dengan benar dihargai.
Saya juga akan sangat tertarik pada kasus terburuk di tempat quicksort stabil. Dari apa yang saya pahami, memodifikasi quicksort menjadi case terburuk membutuhkan pemilihan poros yang tepat yang akan menghancurkan stabilitas yang biasanya akan dinikmati.
Ini murni kepentingan teoretis dan saya tidak punya aplikasi praktis. Saya hanya ingin tahu algoritma yang memiliki ketiga fitur ini.
sumber
Jawaban:
Ada beberapa algoritma yang semuanya di atas, dan hampir semuanya telah ditemukan dalam 30 tahun terakhir.
Mungkin yang paling baik adalah kelas algoritma yang disebut Block sort , termasuk versi (disebut WikiSort) oleh Kim dan Kutzner pada tahun 2008. Tidak hanya stabil dan sepenuhnya di tempat (O (1) memori overhead dalam model transdichotomous), itu juga adaptif, dan dengan demikian akan mengambil langkah lebih sedikit untuk mengurutkan daftar hampir diurutkan, konvergen ke perbandingan O (n) dalam kasus daftar yang sudah diurutkan. Anda dapat menemukan implementasi di C, C ++, dan Java di sini: https://github.com/BonzaiThePenguin/WikiSort
Yang juga menarik adalah algoritma GrailSort (juga semacam Blok) oleh Huang dan Langston (1989-1992), yang sebenarnya mengungguli WikiSort pada beberapa jenis kasus uji. Implementasi C ++ tersedia di sini: https://github.com/Mrrl/GrailSort
sumber
Anda dapat menulis mergesort yang stabil dan di tempat. Lihat ini untuk detailnya. Dengan kata-kata penulis sendiri:
Saya tidak akan menyalin kode di sini, tetapi Anda dapat menemukannya di tautan atau dengan memeriksa C ++ STL. Harap beri tahu saya jika Anda ingin saya mencoba memberikan deskripsi yang lebih terperinci tentang apa yang terjadi di sini.
sumber
Silakan anggap ini sebagai komentar panjang tentang beberapa pemikiran praktis. Meskipun ini bukan jawaban untuk pertanyaan Anda, saya pikir Anda mungkin tertarik dengan diskusi Python ini:
Sumber: bugs.python.org , penulis: Tim Peters
Perhatikan juga bahwa Timsort berkinerja baik pada array yang sudah diurutkan.
Jadi Python memanfaatkan Timsort (yang merupakan Mergesort dengan beberapa tweak) dan ketika saya telah melihat implementasi Java beberapa tahun yang lalu, itu juga Mergesort (saya pikir mereka sekarang juga menggunakan Timsort).
sumber