Saya telah menemukan banyak algoritma penyortiran selama studi sekolah menengah saya. Namun, saya tidak pernah tahu mana yang tercepat (untuk array integer acak). Jadi pertanyaan saya adalah:
- Manakah algoritma penyortiran tercepat yang saat ini dikenal?
- Secara teoritis, mungkinkah ada yang lebih cepat? Jadi, apa kompleksitas paling sedikit untuk menyortir?
Jawaban:
Jawaban ini hanya membahas kompleksitas. Waktu berjalan aktual implementasi algoritma akan tergantung pada sejumlah besar faktor yang sulit diperhitungkan dalam satu jawaban.
sumber
Jawabannya, seperti yang sering terjadi pada pertanyaan semacam itu, adalah "itu tergantung". Itu tergantung pada hal-hal seperti (a) seberapa besar bilangan bulat itu, (b) apakah array input berisi bilangan bulat dalam urutan acak atau dalam urutan hampir diurutkan, (c) apakah Anda memerlukan algoritma pengurutan agar stabil atau tidak, serta faktor-faktor lain, (d) apakah seluruh daftar angka sesuai dengan memori (jenis di-memori vs jenis eksternal), dan (e) mesin tempat Anda menjalankannya.
Dalam praktiknya, algoritma pengurutan dalam pustaka standar bahasa Anda mungkin akan cukup bagus (cukup dekat dengan optimal), jika Anda memerlukan jenis memori. Oleh karena itu, dalam praktiknya, cukup gunakan fungsi apa pun yang disediakan oleh perpustakaan standar, dan ukur waktu berjalan. Hanya jika Anda menemukan bahwa (i) penyortiran adalah sebagian besar dari keseluruhan waktu berjalan, dan (ii) waktu berjalan tidak dapat diterima, jika Anda repot-repot bermain-main dengan algoritma penyortiran. Jika kedua kondisi tersebut berlaku, maka Anda dapat melihat aspek spesifik dari domain tertentu dan bereksperimen dengan algoritma pengurutan cepat lainnya.
Namun secara realistis, dalam praktiknya, algoritma pengurutan jarang menjadi hambatan kinerja utama.
sumber
Selanjutnya, jawab pertanyaan kedua Anda
Untuk penyortiran tujuan umum, kompleksitas masalah penyortiran berbasis perbandingan adalah Ω (n log n) . Ada beberapa algoritma yang melakukan pengurutan dalam O (n), tetapi mereka semua bergantung pada membuat asumsi tentang input, dan bukan algoritma pengurutan tujuan umum.
Pada dasarnya, kompleksitas diberikan oleh jumlah perbandingan minimum yang diperlukan untuk mengurutkan array (log n mewakili ketinggian maksimum pohon keputusan biner yang dibangun ketika membandingkan setiap elemen array).
Anda dapat menemukan bukti formal untuk menyortir kompleksitas yang lebih rendah di sini :
sumber
sumber
Saya membaca dua jawaban lainnya pada saat menulis ini dan saya tidak berpikir salah satu menjawab pertanyaan Anda dengan tepat. Jawaban lain dianggap ide-ide asing tentang distribusi acak dan kompleksitas ruang yang mungkin di luar ruang lingkup untuk studi sekolah menengah. Jadi inilah yang saya ambil.
sumber
sumber
sumber
Karena Anda tidak menyebutkan batasan pada perangkat keras dan mengingat Anda mencari "yang tercepat", saya akan mengatakan Anda harus memilih salah satu algoritma pengurutan paralel berdasarkan perangkat keras yang tersedia dan jenis input yang Anda miliki.
Secara teori misalnya
quick_sort
adalahO(n log n)
. Denganp
prosesor, idealnya ini harus turunO(n/p log n)
jika kita menjalankannya secara paralel.Mengutip Wikipedia: Kompleksitas waktu ...
Dalam praktiknya, untuk ukuran input masif tidak mungkin tercapai
O(log n)
karena masalah skalabilitas.Berikut ini adalah kode pseudo untuk pengurutan Paralel paralel . Implementasi
merge()
bisa sama seperti dalam penggabungan normal:Lihat juga:
sumber