[Powered by Google Translate] [BUBBLE SORT]
[JACKSON STEINKAMP HARVARD UNIVERSITY]
[INI ADALAH CS50. CS50TV]
Susun gelembung satu contoh algoritma sorting -
iaitu, satu prosedur untuk menyusun satu set unsur-unsur dalam
urutan naik atau turun.
Sebagai contoh, jika anda mahu untuk menyelesaikan array yang terdiri daripada nombor
[3, 5, 2, 9], pelaksanaan yang betul Susun Bubble akan memulangkan
pelbagai disusun [2, 3, 5, 9] dalam tertib menaik.
Sekarang, saya akan terangkan dalam pseudokod bagaimana algoritma berfungsi.
>> Mari kita mengatakan bahawa kita sedang menyusun senarai sebanyak 5 integer - 3, 2, 9, 6, dan 5.
Algoritma bermula dengan melihat dua unsur pertama, 3 dan 2,
dan memeriksa jika mereka berada di luar perintah relatif kepada satu sama lain.
Mereka adalah - 3 adalah lebih daripada 2.
Untuk menjadi dalam usaha menaik, mereka harus menjadi cara lain di sekeliling.
Jadi, kita menukar mereka.
Sekarang senarai kelihatan seperti ini: [2, 3, 9, 6, 5].
>> Seterusnya, kita melihat unsur-unsur yang kedua dan ketiga, 3 dan 9.
Mereka berada dalam susunan yang betul relatif kepada satu sama lain.
Iaitu, 3 adalah kurang daripada 9 jadi algoritma tidak menukar mereka.
Seterusnya, kita melihat pada 9 dan 6. Mereka keluar perintah.
>> Jadi, kita perlu untuk menukar mereka kerana 9 adalah lebih besar daripada 6.
Akhir sekali, kita melihat dua integer lepas, 9 dan 5.
Mereka berada di luar perintah, jadi mereka mesti ditukar.
Selepas pas pertama yang lengkap melalui senarai,
ia kelihatan seperti ini: [2, 3, 6, 5, 9].
Not bad. Ia hampir diselesaikan.
Tetapi kita perlu untuk menjalankan melalui senarai sekali lagi untuk mendapatkan ia benar-benar disusun.
Dua adalah kurang daripada 3, jadi kita tidak menukar mereka.
>> Tiga adalah kurang daripada 6, jadi kami tidak menukar mereka.
Enam adalah lebih besar daripada 5. Kami bertukar.
Enam adalah kurang daripada 9. Kami tidak menukar.
Selepas lulus kedua melalui, ia kelihatan seperti ini: [2, 3, 5, 6, 9]. Sempurna.
Sekarang, mari kita menulis dalam pseudokod.
Pada asasnya, untuk setiap elemen dalam senarai, kita perlu melihat ia
dan unsur terus ke kanan.
Jika mereka berada di luar perintah relatif kepada satu sama lain - iaitu, jika unsur di sebelah kiri
adalah lebih besar daripada satu di sebelah kanan - kita harus menukar dua elemen.
>> Kami lakukan ini untuk setiap elemen senarai, dan kita telah membuat satu pas melalui.
Sekarang kita hanya perlu untuk melakukan kali pass-through cukup untuk memastikan senarai
sepenuhnya, disusun dengan betul.
Tetapi berapa kali kita perlu melalui senarai
menjamin bahawa kita sedang dilakukan?
Nah, senario kes terburuk adalah jika kita mempunyai senarai yang sepenuhnya ke belakang.
Kemudian ia mengambil beberapa lulus-lewat sama dengan bilangan
unsur-unsur n-1.
Jika ini tidak masuk akal intuitif, berfikir kes mudah - senarai [2, 1].
>> Ini akan mengambil satu pas-melalui untuk menyusun dengan betul.
[3, 2, 1] - kes terburuk adalah bahawa dengan 3 unsur disusun ke belakang,
ia akan mengambil 2 lelaran untuk apapun.
Selepas satu lelaran, [2, 1, 3].
Hasil kedua array disusun [1, 2, 3].
Jadi anda tahu anda tidak perlu pergi melalui pelbagai, secara umum,
lebih daripada n-1 kali, di mana n adalah bilangan elemen dalam array.
Ia dipanggil Disusun sad kerana unsur-unsur terbesar cenderung untuk 'gelembung'
kepada hak yang cantik dengan cepat.
Malah, algoritma ini mempunyai tingkah laku yang sangat menarik.
>> Selepas lelaran m melalui pelbagai keseluruhan,
m paling kanan elemen yang dijamin
akan disusun ke tempat yang betul.
Jika anda mahu melihat ini untuk diri sendiri,
kita boleh cuba ia pada senarai sepenuhnya ke belakang [9, 6, 5, 3, 2].
Selepas satu pas melalui senarai keseluruhan,
[Bunyi bertulis]
[6, 9, 5, 3, 2], [6, 5, 9, 3, 2], [6, 5, 3, 9, 2], [6, 5, 3, 2, 9]
elemen paling kanan 9 adalah di tempat yang betul.
Selepas kedua pass-through, 6 akan mempunyai 'dipam-up' kepada
tempat kedua paling kanan.
Dua elemen di sebelah kanan - 6 dan 9 - akan berada di tempat yang betul mereka
selepas yang pertama dua pas-lewat.
>> Jadi, bagaimana kita boleh menggunakan ini untuk mengoptimumkan algoritma?
Nah, selepas satu lelaran melalui array
kita sebenarnya tidak perlu untuk memeriksa elemen paling kanan
kerana kita tahu ia diselesaikan.
Selepas dua lelaran, kita tahu pasti dua elemen paling kanan adalah di tempat.
Jadi, secara umum, selepas lelaran k melalui pelbagai penuh,
memeriksa elemen k terakhir adalah berlebihan kerana kita tahu
mereka berada di lokasi yang betul sudah.
>> Jadi, jika anda menyusun pelbagai unsur-unsur n,
pada lelaran pertama - karena perlu menyelesaikan semua elemen - pertama n-0.
Pada lelaran kedua, anda akan perlu melihat semua elemen tetapi lepas -
pertama n-1.
Pengoptimuman lain mungkin untuk memeriksa jika senarai sudah disusun
selepas setiap lelaran.
Jika ia sudah disusun, kita tidak perlu membuat apa-apa lagi lelaran
melalui senarai.
Bagaimana kita boleh melakukan ini?
Nah, jika kita tidak membuat apa-apa pertukaran pada pas-melalui senarai,
ia adalah jelas bahawa senarai itu sudah diselesaikan kerana kami tidak menukar apa-apa.
Jadi, kita pasti tidak perlu untuk menyusun semula.
>> Mungkin anda boleh memulakan pembolehubah bendera dipanggil 'tidak disusun'
palsu dan menukar ia kepada true jika anda mempunyai untuk menukar mana-mana elemen
satu lelaran melalui array.
Atau sama, membuat kaunter untuk mengira berapa banyak swap anda membuat
pada lelaran yang diberikan.
Pada akhir lelaran, jika anda tidak menukar mana-mana elemen,
anda tahu senarai sudah disusun dan anda selesai.
Susun gelembung, seperti algoritma sorting lain, boleh
mengagak untuk bekerja bagi mana-mana elemen yang mempunyai satu kaedah pesanan.
>> Iaitu, diberi dua elemen anda mempunyai cara untuk mengatakan jika yang pertama
adalah lebih besar daripada, sama dengan atau kurang daripada yang kedua.
Sebagai contoh, anda boleh menyusun huruf abjad dengan mengatakan
bahawa <b, b <c, dan lain-lain
Atau anda boleh menyusun hari dalam seminggu di mana hari Ahad adalah kurang daripada Isnin
yang kurang daripada Selasa.
>> Susun Bubble adalah tidak bermakna sorting algoritma yang sangat cekap atau cepat.
Runtime kes terburuk adalah Big O n ²
kerana anda perlu membuat lelaran n melalui senarai
memeriksa semua elemen n setiap pas-melalui, nxn = n ².
Kali ini dijalankan bermakna bahawa sebagai bilangan unsur anda sorting kenaikan,
masa run meningkatkan quadratically.
>> Tetapi jika kecekapan tidak adalah satu kebimbangan utama program anda
atau jika anda hanya sorting sebilangan kecil unsur,
anda mungkin mencari Susun sad berguna kerana
ia adalah salah satu algoritma sorting mudah untuk memahami
dan kod.
Ia juga merupakan cara terbaik untuk mendapatkan pengalaman dengan menterjemahkan teori
algoritma ke dalam kod fungsi sebenar.
Nah, itulah Disusun Bubble untuk anda. Terima kasih kerana menonton.
CS50.TV