氣泡排序法(Bubble Sort) - 小殘的程式光廊

文章推薦指數: 80 %
投票人數:10人

氣泡排序法(Bubble Sort) · 比較相鄰的兩個元素,若前面的元素較大就進行交換。

· 重複進行1的動作直到最後面,最後一個元素將會是最大值。

· 重複進行1,2的 ... 小殘的程式光廊 跳到主文 提供一些演算法、資料結構、程式題目的整理與說明,PHP和JavaScript的基本教學和一些程式相關問題與解法。

部落格全站分類:數位生活 相簿 部落格 留言 名片 公告版位 Nov10Sat201221:17 氣泡排序法(BubbleSort) 簡介 氣泡排序法(BubbleSort)是最容易理解和實作的一種排序演算法,也翻譯作冒泡排序法。

由於它很容易學習,所以也是許多演算法課程中第一個學習的排序演算法。

由於他的演算法過程會將最大的數值移動到陣列最後面,而較小的數值則逐漸的往陣列前端移動,就像有許多氣泡慢慢從底部浮出,因此成為氣泡排序法。

他的運作流程如下: 比較相鄰的兩個元素,若前面的元素較大就進行交換。

重複進行1的動作直到最後面,最後一個元素將會是最大值。

重複進行1,2的動作,每次比較到上一輪的最後一個元素。

重複進行以上動作直到沒有元素需要比較。

流程示意圖:        實作上直接使用迭代法迴圈就可以很容易的完成。

另外可以使用額外的旗標(Flag)來判斷這一輪是否有發生交換情形,若都沒有發生交換表示數列已經是排序好的,即可跳出迴圈,因此最佳時間複雜度是有可能達到O(n)。

分析 最佳時間複雜度:O(n) 平均時間複雜度:O(n^2) 最差時間複雜度:O(n^2) 空間複雜度:O(1) Stablesort:是 虛擬碼 一般版本 functionsort(list) //重複N次 fori=0tolist.length-1 //比較到上一輪最後一個 forj=0tolist.length-i-1 iflist[j]>list[j+1] swap(list[j],list[j+1]) endif endfor endfor endfunction 旗標版本 functionsort(list) //重複N次 fori=0tolist.length-1 varswapped=false //比較到上一輪最後一個 forj=0tolist.length-i-1 iflist[j]>list[j+1] swap(list[j],list[j+1]) swapped=true endif endfor if!swapped break endif endfor endfunction 語法 C# 一般版本 usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; namespaceBubbleSort { classBubbleSort { publicstaticvoidSort(int[]array) { for(inti=array.Length-1;i>0;--i) for(intj=0;jarray[j+1]) Swap(array,j,j+1); } privatestaticvoidSwap(int[]array,intindexA,intindexB) { inttmp=array[indexA]; array[indexA]=array[indexB]; array[indexB]=tmp; } } } 旗標版本 usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; namespaceBubbleSort { classFlagBubbleSort { publicstaticvoidSort(int[]array) { for(inti=array.Length-1;i>0;--i) { boolswapped=false; for(intj=0;jarray[j+1]) { Swap(array,j,j+1); swapped=true; } if(!swapped) break; } } privatestaticvoidSwap(int[]array,intindexA,intindexB) { inttmp=array[indexA]; array[indexA]=array[indexB]; array[indexB]=tmp; } } } Java 一般版本 publicclassBubbleSort{ publicstaticvoidSort(int[]array) { for(inti=array.length-1;i>0;--i) for(intj=0;jarray[j+1]) Swap(array,j,j+1); } privatestaticvoidSwap(int[]array,intindexA,intindexB) { inttmp=array[indexA]; array[indexA]=array[indexB]; array[indexB]=tmp; } } 旗標版本 publicclassFlagBubbleSort{ publicstaticvoidSort(int[]array) { for(inti=array.length-1;i>0;--i) { booleanswapped=false; for(intj=0;jarray[j+1]) { Swap(array,j,j+1); swapped=true; } if(!swapped) break; } } privatestaticvoidSwap(int[]array,intindexA,intindexB) { inttmp=array[indexA]; array[indexA]=array[indexB]; array[indexB]=tmp; } } C++ 一般版本 BubbleSort.h #ifndefBUBBLESORT_H #defineBUBBLESORT_H #include usingnamespacestd; classBubbleSort { public: staticvoidSort(int*array,intlength); protected: private: }; #endif//BUBBLESORT_H BubbleSort.cpp #include"BubbleSort.h" voidBubbleSort::Sort(int*array,intlength) { for(inti=length-1;i>0;--i) for(intj=0;jarray[j+1]) swap(array[j],array[j+1]); } 旗標版本 FlagBubbleSort.h #ifndefFLAGBUBBLESORT_H #defineFLAGBUBBLESORT_H #include usingnamespacestd; classFlagBubbleSort { public: staticvoidSort(int*array,intlength); protected: private: }; #endif//FLAGBUBBLESORT_H FlagBubbleSort.cpp #include"FlagBubbleSort.h" voidFlagBubbleSort::Sort(int*array,intlength) { for(inti=length-1;i>0;--i) { boolswapped=false; for(intj=0;jarray[j+1]) { swap(array[j],array[j+1]); swapped=true; } if(!swapped) break; } } 下載 VS2010C#版本 EclipseJava版本 Code::BlocksC++版本 文章標籤 演算法 alogrithm sorting 排序 氣泡排序法 bubblesort 全站熱搜 創作者介紹 emn178 小殘的程式光廊 emn178發表在痞客邦留言(1)人氣() E-mail轉寄 全站分類:數位生活個人分類:演算法此分類上一篇:排序演算法(Sorting) 此分類下一篇:插入排序法(InsertionSort) 上一篇:[台北]2012年10月10日-小白宮&自由廣場 下一篇:插入排序法(InsertionSort) ▲top 留言列表 發表留言 參觀人氣 本日人氣: 累積人氣: 熱門文章 文章分類 電腦程式(10) Ruby(8)JavaScript(17)TopCoder(7)演算法(19)rails(2)資料結構(8)PHP(12)Java(3)C#(4)其他(14) 智力測驗(10)旅遊(24)未分類文章(4) 最新文章 最新留言 文章搜尋 文章精選 文章精選 2015七月(1) 2015六月(3) 2015五月(4) 2015二月(2) 2015一月(4) 2014九月(1) 2014八月(2) 2014六月(1) 2014一月(1) 2013十二月(1) 2013十一月(1) 2013九月(2) 2013八月(2) 2013四月(5) 2013三月(4) 2013二月(2) 2013一月(6) 2012十二月(4) 2012十一月(11) 2012十月(3) 2012八月(10) 2012五月(1) 2012四月(9) 2012三月(11) 2012二月(3) 2012一月(1) 2011十二月(3) 2011十一月(5) 2011十月(3) 2011九月(3) 2011八月(10) 2011七月(2) 2010九月(1) 2010八月(1) 2010五月(4) 2010四月(5) 所有文章列表 新聞交換(RSS) 回到頁首 回到主文 免費註冊 客服中心 痞客邦首頁 ©2003-2022PIXNET 關閉視窗



請為這篇文章評分?