[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