Jadi penggabungan sort adalah algoritma divide and conquer. Ketika saya melihat diagram di atas, saya berpikir apakah mungkin untuk mem-bypass semua langkah pembagian.
Jika Anda mengulangi lebih dari array asli sambil melompat dua, Anda bisa mendapatkan elemen di at i dan i +1 dan menempatkan mereka ke dalam array yang diurutkan sendiri. Setelah Anda memiliki semua sub-array ini ([7,14], [3,12], [9,11] dan [2,6] seperti yang ditunjukkan pada diagram), Anda dapat melanjutkan dengan rutin gabungan normal untuk mendapatkan array yang diurutkan.
Apakah iterasi melalui array dan segera menghasilkan sub-array yang diperlukan kurang efisien daripada melakukan langkah-langkah membagi secara keseluruhan?
algorithms
sorting
efficiency
mergesort
Jimmy_Rustle
sumber
sumber
Jawaban:
Kebingungan muncul dari perbedaan antara deskripsi konseptual dari algoritma, dan implementasinya .
Secara logis menggabungkan semacam digambarkan sebagai memisahkan array menjadi array yang lebih kecil, dan kemudian menggabungkannya kembali bersama-sama. Namun, "pemisahan array" tidak menyiratkan "membuat array yang sama sekali baru di memori", atau apa pun seperti itu - itu dapat diimplementasikan dalam kode sebagai
yaitu tidak ada pekerjaan yang sebenarnya terjadi, dan "pemisahan" adalah murni konseptual. Jadi apa yang Anda sarankan tentu berhasil, tetapi secara logis Anda masih "memecah" array - Anda hanya tidak memerlukan pekerjaan apa pun dari komputer untuk melakukannya :-)
sumber
1<<n+1
. Meskipun saya yakin Anda dapat menyesuaikan hal-hal sehingga ekor yang terlalu kecil bisa digabung menjadi bagian yang lebih rendah.Saya kira yang Anda maksud adalah implementasi bottom-up . Dalam implementasi bottom-up Anda mulai dari elemen sel tunggal bergerak ke atas dengan menggabungkan elemen ke dalam daftar / array yang lebih besar diurutkan. Balikkan panah pada gambar di atas mulai dari array tengah, yaitu array satu elemen.
Selain itu, Anda mungkin ingin mengoptimalkan penggabungan dengan membagi array hingga mencapai ukuran konstan, setelah itu Anda cukup mengurutkannya menggunakan misalnya penyisipan misalnya.
Kalau tidak, menyortir tanpa memisahkan array tidak mungkin. Sebenarnya inti dari jenis Gabung adalah membagi dan menyortir subarrays, yaitu, membagi-dan-taklukkan.
sumber