氣泡排序(bubble sort),是一種電腦科學領域的較簡單的排序演算法。氣泡排序的特點它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從z到a)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。
這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端(公升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名「氣泡排序」。
基本做法(從小到大)
比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對所有的元素重複以上的步驟,除了最後乙個。
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
}console.writeline($"結果:;迴圈次數:;資料交換次數:");
}以上內容,除了**全部來自網路,盜圖請諒解,因為做這麼個圖是在太難了通過**,我們發現,冒泡演算法的執行次數其實應該是 (n-1)+(n-2)+(n-3)+...,等於 n(n-1)/2 次,所以得出結論,冒泡算的時間複雜度是o(n^2)
但是,上面介紹不是說有最好的情況下(資料本身就是從小到大排列)時間複雜度是 o(n)嗎?
其實,上面的介紹和實際演算法都存在一些問題,是有可以優化的地方的。
從文字角度上說,既然叫冒泡演算法,我們想想水裡氣泡的形態,一般都是從底部公升起到水面,所以,為了更符合實際情況,我們的比較工作應該從陣列的尾部開始,把最小(從小到大)的元素慢慢移動到陣列的最前的位置。
所以這裡先修改一版**,把比較的順序倒過來,不是把最大的往後移,而是把最小的往前移
public void sort2(int numbers)
}console.writeline($"結果:;迴圈次數:;資料交換次數:");
}
執行一下,我們會發現,調整後的**迴圈的次數和效率跟第一版一模一樣,肯定的啊,因為中心思路沒變,只是把冒泡的方向倒換了一下而已。
下面,我們考慮這樣乙個陣列:[1,0,2,3,5,4],使用第二版的**:
第一次迴圈結束,陣列結果為 [0,1,2,3,4,5],很神奇有沒有,我們不僅把最小的0冒泡到第一位,順帶的最後兩個元素也進行了排序。然後目測一下,陣列已經是正序排列了,也就是說這是我們應該可以返回了有木有?
這也就是為什麼要從尾部往前冒泡的原因。好了,可以優化的點出現了,接下來,請看第三版**
public void sort3(int numbers)}}
console.writeline($"結果:;迴圈次數:;資料交換次數:");
}
下面,來進行乙個測試:
var bubble = new bubblesortsample();
var numbers = new int ;
bubble.sort1(numbers);
console.writeline();
numbers = new int ;
bubble.sort2(numbers);
console.writeline();
numbers = new int ;
// 第一次 1,3,2,4,5,6,9,發生了交換,迴圈了6次
// 第二次 1,2,3,4,5,6,9,發生了交換,迴圈了5次
// 第三次 檢查了一圈,迴圈了4次,沒有發生交換,跳出
bubble.sort3(numbers);
氣泡排序是一種比較基礎而且大家比較熟悉的演算法,以前總是知其然而沒有深究過,網上很多例子也是如第一版**一樣簡單實現演示一下了事,卻不知原來這麼基礎的演算法也有這麼多的門道在其中,所以說學海無涯...省略一萬五千字雞 排序演算法 一 氣泡排序
排序的演算法有很多,例如直接插入排序,希爾排序,氣泡排序,選擇排序,快速排序,堆排序等等。最簡單基礎就是氣泡排序了,關於排序hi有乙個系列。今天是第一篇,主要講氣泡排序演算法思想以及從各個方面對它進行優化。氣泡排序 原理舉例 設陣列長度為n。1 比較相鄰的前後二個資料,如果前面資料大於後面的資料,就...
排序演算法(一) 氣泡排序
排序思路 樣例 1.從首位元素開始,前後元素相比較,保證 小在前 大在後 逐個元素向後遞推。一遍結束後,最大元素將位於排序末位。16 35 9 35 5 35 20 35 結果 2.因為最大元素已經排位完畢,所以不考慮末位最大元素,從頭開始,再做一輪排序。排序範圍 結果 可以看出,第二大元素已經排至...
排序演算法(一)氣泡排序
氣泡排序 bubble sort,台灣譯為 泡沫排序或氣泡排序 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。以將陣列 number n 中的n個數從小到大排序為例 ...