03 冒泡排序 為描述方便,用下面的數組模擬小朋友的交換過程。 核心思想(升序):
從首位置開始,依次比較前后兩個數,如果前面的數比后面的數大,就交換兩個數。這樣第1輪結束后,最大的數就會移動到最后的位置。對剩余元素重復執行N-1次,整個數組有序。因為像空氣上浮到水面,最大的元素會慢慢浮到最后,所以冒泡因此得名。
3.1 第1輪 執行完成后,最大的元素歸位。
3.2 第2輪 第2輪接著對前面剩余的N-1個元素重復上面步驟,第2大的元素歸位。
3.3 第3輪 第3輪對前面剩余的N-2個元素重復上面步驟,第3大的元素歸位。 總共執行N-1次操作,所有元素歸位。
3.4 代碼實現
for (int i = 0; i 《 n - 1; ++i) { for (int j = 0; j 《 n - i - 1; ++j) { if (a[j] 》 a[j + 1]) { swap(a[j], a[j + 1]); } } } 04 問題及優化
4.1 迭代輪次優化 如果原數組為如下情況,那么在執行完第1輪后,整個數組已經有序,后面的輪次沒必要執行,可以針對這種情況做一次優化改進。 改進點1: 如果某一輪沒有發生過交換,說明數組已經有序,那么以后也不會發生交換,此時可以終止迭代。 代碼實現
for (int i = 0; i 《 n - 1; ++i) { // flag標記是否有交換 bool flag = true; for (int j = 0; j 《 n - i - 1; ++j) { if (a[j] 》 a[j + 1]) { swap(a[j], a[j + 1]); flag = false; } } if (flag) { break; } }
4.2 掃描范圍優化 如果為以下情況,我們會發現最后的6和8所處的位置和最終排序完成的位置一樣,說明過程中他們的位置不會發生變化。 上一輪最后交換的位置,在下一輪時,此位置后面的數也不會再發生交換。 改進點2: 記錄每一次最后發生交換的位置,下一輪只需要掃描到此位置的前一個即可。 代碼實現
// 記錄最后交換的位置 int position = 0; int len = n - 1; for (int i = 0; i 《 n - 1; ++i) { // flag標記是否有交換 bool flag = true; for (int j = 0; j 《 len; ++j) { if (a[j] 》 a[j + 1]) { swap(a[j], a[j + 1]); flag = false; position = j; } } len = position; if (flag) { break; } }
05 總結
冒泡排序是比較簡單的一種排序算法,核心思想就是比較相鄰的兩個數,但效率比較低所以可做一些優化。時間復雜度為O(N^2),數據規模較小時可采用,但數據過大時就不建議采用冒泡了。
編輯:jq
-
數據
+關注
關注
8文章
7145瀏覽量
89593 -
代碼
+關注
關注
30文章
4828瀏覽量
69064
原文標題:圖解算法:冒泡排序
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
詳解Linux sort命令之掌握排序技巧與實用案例
TimSort:一個在標準函數庫中廣泛使用的排序算法
時間復雜度為 O(n^2) 的排序算法
![時間復雜度為 O(n^2) 的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>](https://file1.elecfans.com//web2/M00/0A/90/wKgaomcQeFWAejYVAAF0WDlfIVY746.jpg)
FPGA設計經驗之圖像處理
STM32F4用來作為計算單元的時候,如何評估算法或應用的時間性能?
支持 ACPI 的 10 軌電源排序器和監視器UCD9090A數據表
![支持 ACPI 的 10 軌電源<b class='flag-5'>排序</b>器和監視器UCD9090A數據表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
FPGA實現雙調排序算法的探索與實踐
![FPGA實現雙調<b class='flag-5'>排序</b><b class='flag-5'>算法</b>的探索與實踐](https://file1.elecfans.com/web2/M00/C4/41/wKgZomXyWEeAaEKTAAAJZpFnz-M952.jpg)
評論