Sortir array dari

8

Saya mencoba memahami bagaimana saya bisa mengurutkan array n elemen saat saja logn tidak ada di tempat.

Saya mendengar bahwa paling banyak menyortir array I inversi memiliki kompleksitas O(nlog(I/n)). Karena adalogn elemen yang tidak disortir, dalam kasus saya paling banyak ada nlogn inversi.

Jawaban untuk pertanyaan itu adalah O(nloglogn) yang konsisten dengan rumus, tetapi saya tidak dapat memahami "ide di baliknya, atau algoritma penyortiran mana yang mencapainya.

pengguna64264
sumber

Jawaban:

9

Berasumsi bahwa "k elemen tidak pada tempatnya "berarti ada k elemen yang penghapusan meninggalkan sisa array diurutkan, ada O(n+klogk)Algoritma -waktu untuk mengurutkan seluruh array.

Singkatnya, hitung paling tidak panjang selanjutnya n2k, urutkan yang lain, dan gabungkan. Yang pertama dapat dicapai dalam waktuO(n)oleh algoritma tumpukan sederhana yang mendorong elemen satu per satu dan muncul dua teratas setiap kali mereka rusak. Strategi penghapusan yang optimal harus menghapus setidaknya satu dari elemen-elemen ini, sehingga total kerusakan dapat dipecahkan oleh2k penghapusan.

David Eisenstat
sumber
+1 untuk gagasan rapi. Hanya satu hal (dan saya mungkin membelah rambut di sini), dapatkah Anda benar-benar membuat insersi di tempat sewenang-wenang untuk menghindariO(n)"tolong, semua orang bergeser ke kanan"? Saya percaya kita harus melacak penyisipan dalam struktur terpisah, membuat satu operan terakhir di akhir untuk menghasilkan array yang diurutkan.
quicksort
@quicksort lebih baik menyortir memo dan menggabungkan metode
David Eisenstat
1
Itu hal yang sama, tetapi menggabungkan itu lebih bersih, saya setuju.
quicksort
1
Layak disebutkan adalah bahwa ini asimtotik optimal (menggunakan perbandingan) dalam ketergantungan pada n dan k.
aelguindy
Algoritme yang Anda gambarkan sepertinya adalah drop-merge sort .
Morwenn
5

Katakanlah ada k elemen bukan tempat.

Membagi array menjadi sub-array yang tidak berkurang. Ini bisa dilakukan diΘ(n) waktu dan akan menghasilkan paling banyak 2ksubarrays. Sekarang kita hanya menggabungkan keduanya secara berpasanganΘ(ncatatank) waktu, menghasilkan array yang diurutkan.

quicksort
sumber