Saya belajar tentang quicksort dan ingin mengilustrasikan berbagai array yang sulit dimiliki quicksort. Quicksort yang saya pikirkan tidak memiliki pengocokan acak awal, partisi 2, dan tidak menghitung median.
Saya memikirkan tiga contoh sejauh ini:
[1,2,3,4,5,6,7,8,9,10] - when the array is sorted
[10,9,8,7,6,5,4,3,2,1] - when the array is reversed
[1,1,1,1,1,1,1,1,1,1] - when the array is the same values
[1,1,1,2,2,2,3,3,3,3] - when there are few and unique keys
Misalnya, saya tidak terlalu yakin tentang yang ini:
[1,3,5,7,9,10,8,6,4,2]
Jadi apa yang membuat array yang quicksort mengalami kesulitan dibandingkan dengan yang cepat (hampir) ideal?
algorithms
sorting
mrQWERTY
sumber
sumber
[2,1,2,1,2,1,2,1]
dan itu menjadi keseluruhan menjawab). Tujuan dari pertanyaan itu adalah, idealnya, menjadi tempat di mana orang lain dapat datang dan mencari tahu lebih banyak tentang mengapa (yang memiliki jawaban) daripada contoh (yang jumlahnya tak terhitung).Jawaban:
Setiap algoritma memiliki kasus terburuk, dan dalam banyak kasus kasus terburuk benar-benar buruk sehingga layak untuk diuji. Masalahnya adalah, tidak ada kasus terburuk tunggal hanya karena Anda tahu algoritma dasar.
Kasus terburuk yang umum termasuk: sudah diurutkan; diurutkan secara terbalik; hampir disortir, satu elemen rusak; semua nilai sama; semua sama kecuali pertama (atau terakhir) lebih tinggi (atau lebih rendah). Kami pernah memiliki semacam kasus di mana kasus terburuk adalah pola gigi gergaji tertentu, yang sangat sulit untuk diprediksi tetapi cukup umum dalam praktiknya.
Kasus terburuk untuk quicksort adalah salah satu yang membuatnya selalu memilih poros paling buruk, sehingga salah satu partisi hanya memiliki satu elemen. Jika pivot adalah elemen pertama (pilihan buruk) maka data yang sudah diurutkan atau dibalik adalah kasus terburuk. Untuk median-dari-tiga data pivot yang semuanya sama atau hanya yang pertama atau terakhir berbeda lakukan triknya.
Untuk quicksort kompleksitas rata-rata adalah nlogn dan kasus terburuk adalah n ^ 2. Alasan mengapa layak memicu perilaku kasus terburuk adalah karena ini juga merupakan kasus yang menghasilkan kedalaman rekursi terbesar. Untuk implementasi yang naif, kedalaman rekursi bisa n, yang dapat memicu stack overflow. Menguji situasi ekstrem lainnya (termasuk kasus terbaik) mungkin bermanfaat untuk alasan serupa.
sumber
O(NlogN)
kinerja rata-rata atau lebih baik) kasus terburuk dan rata-rata memiliki kompleksitas yang sama. Itu menunjukkan bahwa biasanya TIDAK layak pengujian untuk kasus terburuk. (Mengingat bahwa tes itu mungkinO(N)
... atau lebih buruk.)Algoritma lolos dari kebanyakan kasus buruk menggunakan pivot acak, mengecualikan elemen kontinu sama dengan pivot dari partisi, dan pencarian asimetris. Itu mencari maju elemen lebih besar atau sama dengan pivot, dan mencari mundur elemen kurang dari pivot.
Saya berterima kasih kepada MichaelT, pencarian Asimetris dirancang untuk menyelesaikan [2,1,2,1,2,1,2,1].
Hasil berikut dihasilkan oleh fungsi saya qsort_random (). N = 100.000
Sebagian besar kasus lebih cepat daripada pola acak. Pola lembah adalah kasus yang buruk untuk sebagian besar pemilihan poros.
qsort_log2 () keluar dari kasus buruk dengan memilih pivot di elemen log2 (N).
qsort (3) menggunakan perpustakaan GNU yang merupakan semacam pengurutan indeks.
qsort_trad () pilih pivot di elemen pertama, tengah dan terakhir.
qsort_random () dan qsort_log2 () tidak menggunakan swapping.
Sumber C program dan skrip diposting di github .
sumber