Saya mencari algoritma pengurutan untuk array int yang tidak mengalokasikan byte apa pun selain ukuran array, dan terbatas pada dua instruksi:
SWAP: menukar indeks berikutnya dengan yang sekarang;
MOVE: memindahkan kursor ke indeks +1 atau -1;
Artinya, Anda tidak dapat menukar indeks yang tidak bertetangga, atau menukar indeks 100
, setelah Anda baru saja menukar indeks 10
. Apa algoritma yang paling efisien - yaitu algoritma yang menggunakan jumlah gerakan total yang lebih sedikit?
algorithms
sorting
in-place
Viktor Maia
sumber
sumber
Jawaban:
Pertimbangkan jenis pengocok koktail , yang merupakan versi dua arah jenis gelembung. Anda bubblesort dari rendah ke tinggi, dan kemudian (ini adalah bagian yang ditambahkan) Anda bubblesort dari tinggi ke rendah, ulangi sampai selesai. Ini masih , tetapi ia membuat rata-rata lintasan lebih sedikit secara signifikan, karena elemen-elemen kecil di dekat ujung tinggi larik akan dipindahkan ke posisi terakhirnya dalam lintasan tunggal daripada lintasan N. Anda juga dapat melacak posisi terendah dan tertinggi di mana terjadi pertukaran; operan selanjutnya tidak perlu memindai melebihi titik-titik tersebut.O ( n2)
sumber
Jumlah swap elemen yang berdekatan yang diperlukan untuk memesan array sama dengan jumlah inversi dalam array. Dengan n elemen secara total, ada paling banyak inversi n * (n-1) / 2 , jadi bubble sort memberikan jumlah swap optimal asimptotik dalam model ini.
sumber
Algoritma yang tidak menggunakan boolean flag untuk mengetahui apakah kita telah menukar elemen atau tidak, diberikan di bawah ini (trik untuk menjaga informasi dalam keadaan mesin, daripada memori):
Solusi dari Eric Lippert, semacam gnome juga berfungsi, karena pada dasarnya itu adalah semacam gelembung dua arah.
sumber