這是最容易理解的交換排序的思想,不是真正的氣泡排序,因為它不是利用兩兩比較臨近數字的大小得出結果,而是拿要確定的位置的數字與後邊各個數字相比較,確定大當家的位置就要讓待選的大當家和後邊的小嘍囉都比試一番,誰贏了就換,二當家也是如此出來的,依次排列。比如對1,5,3,2,6進行從從小到大公升序輸出
那麼第一輪就是比較1和5的大小,由於1<5,則1和5不用交換,然後再讓1和3比較一直到和6比較,一輪下來,就可以保證第乙個位置是最小的了
第二輪就從5開始,分別和後邊的3,2,6進行比較,5先和3交換,3再和2交換,最後第二輪定下來前兩個位置最小,以此類推
void bubblesort1(sqlist *l)//從小到大排序
通過氣泡排序1.0我們不難發現,每次遍歷一次陣列只能從待排序的位置裡找出乙個確定值,而待排序的數互相之間並沒有簡單排序,造成資源浪費。真正的冒泡演算法是兩兩比較臨近數字的大小,每一次遍歷待排序的陣列都會由比較有簡單的排序
比如1,5,3,2,6
第一輪6和2比較,由於6比2大,所以不用交換1 5 3 2 6
2和3比較,2小,所以2和3交換 1 5 2 3 6
2和5比較,2小,所以2和5交換 1 2 5 3 6
2和1比較,2大,所以不用交換,此時這一趟遍歷不僅將最小值放到了第一的位置,而且12,25,23之間也是有序的了
氣泡排序2.0在待排序的陣列已經有序的情況下,比如1,5,3,2,6在第二輪1 2 3 5 6就已經有序了,但是由於此時的i=2,還要進行i=3,i=4,i=5的情況下的沒有必要的近鄰比較,所以如果在i=3走完一輪後,若發現沒有交換數字,即為已經有序,就停止迴圈好了
void bubblesort3(sqlist *l)
} }}
從i值的列印情況可見,在第三輪的時候發現沒有交換就結束遍歷了
測試程式:
int main()
最好的情況是已經有序的順序表,需要有n-1此比較,0此交換,複雜度為o(n)
最壞的情況是逆序的情況,需要有1+2+3+...n-1此比較和移動,複雜度為o(n^2)
排序演算法系列 氣泡排序
氣泡排序是是一種比較基礎簡單的演算法。它的原理是通過對比前後的元素大小,將較大的數換到後面的方式來實現排序 舉個例子 假如現在有乙個無序陣列disorder arr 4,2,19,10,1 第一步 取第0個元素4,和第1個元素2 對比,發現4比2大。第二步 交換4與2的索引。即第0個元素為2,第1個...
排序演算法系列 氣泡排序
對陣列array n 其陣列長度為n,元素索引0 n 1,對其進行公升序排序,針對n 10時,可選擇氣泡排序 氣泡排序要點 1.氣泡排序有兩層迴圈,外層迴圈用來計算有多少個數i不再需要比較,記憶體迴圈負責從index0 index n i 1 將相鄰元素進行比較和交換,簡單來說,第一輪排序時,內層比...
演算法系列 氣泡排序
在我們的生活中,撲克牌應該是每乙個人的娛樂專案之一吧。在我們玩撲克牌的過程中,我們也可以體會到學習的奧秘。我們會根據手裡的牌,從小到大進行排序 即小的牌在前面,大的牌在後面 在這個過程中,我們可以體會並學習氣泡排序的神奇。氣泡排序 臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,這樣...