氣泡排序 Bubble Sort

2021-06-09 17:16:13 字數 1368 閱讀 1554

維基百科:氣泡排序

演算法思想:

不斷的交換相鄰的兩個反序元素,使最小元素「上浮」或使最大元素「下沉」;每一趟「冒泡」都會確定乙個最大的元素或最小的元素,同選擇排序類似,演算法總共只需進行n-1趟。

將乙個陣列豎著放,低位址在上面,高位址在下面,所謂「上浮」就是較小的元素不斷向低位址靠近,所謂「下沉」就是較大的元素不斷向高位址靠近,這只是乙個形象的說法,你可以按自己的方式理解。

氣泡排序是與插入排序擁有相等的執行時間,但是兩種法在需要的交換次數卻很大地不同。在最壞的情況,氣泡排序需要o(n^2)次交換,而插入排序只要最多o(n)次交換。氣泡排序的實現(類似下面的簡單實現)通常會對已經排序好的數列拙劣地執行(複雜度o(n^2)),而插入排序在這個例子只需要o(n)個運算。因此很多現代的演算法教科書避免使用氣泡排序,而用插入排序取代之。氣泡排序如果能在內部迴圈第一次執行時,使用乙個旗標來表示有無需要交換的可能,也有可能把最好的複雜度降低到o(n)。在這個情況,在已經排序好的數列就無交換的需要。若在每次走訪數列時,把走訪順序和比較大小反過來,也可以稍微地改進效率。有時候稱為往返排序(雞尾酒排序),因為演算法會從數列的一端到另一端之間穿梭往返。

1、簡單c++實現

#include #include using namespace std;

/*較大元素下沉

*一趟掃瞄後,置於陣列尾部的是最大元素

*"無序"陣列長度減一,開始下一輪掃瞄

*/ templatevoid bubblesort1(t* a, int n)}}

}//較小元素上浮

templatevoid bubblesort2(t* a, int n)}}

}int main(int argc, char *argv)

//bubblesort1(a,n);

// bubblesort2(a,n);

bubblesort(a,n);

for(int i=0; ivoid bubblesort(t* a, int n)}}

}

氣泡排序肯定還有很多其他的實現方式及其變形,但是原理都是一樣的,這裡就不一一枚舉了。

3、演算法複雜度分析

對於改進後的演算法

最好情況,輸入是有序的,掃瞄一趟後,發現是有序的,change =false,演算法終止,此時演算法的複雜度為:o(n)

最壞情況:由於演算法是按遞增排序,當輸入為遞減序列時,外層迴圈執行n-1次,內層迴圈依次執行n-1,n-2,……1次,演算法的複雜度為:o(n^2)

平均情況下的複雜度和最壞情況下差不多,為o(n^2)

氣泡排序 bubble sort

氣泡排序是最基本的排序演算法,常被做為內部排序的第乙個排序演算法進行講解。它的原理非常簡單,只是一 個兩層迴圈,每次將最大或最小的放到陣列最後。演算法如下 b為陣列的起始位置,e為陣列的結果位置 int bubble int data,int b,int e return n 這個函式返回兩個整數比...

氣泡排序(Bubble Sort)

無論你學習哪種程式語言,在學到迴圈和陣列時,通常都會介紹一種排序演算法來作為例子,而這個演算法一般就是氣泡排序。並不是它的名稱很好聽,而是說這個演算法的思路最簡單,最容易理解。因此,哪怕大家可能都已經學過氣泡排序了,我們還是從這個演算法開始我們的排序之旅。氣泡排序 bubble sort 一種交換排...

氣泡排序(Bubble sort)

氣泡排序 bubble sort 比較簡單,這個演算法的名字由來是因為越大的元素會經由交換慢慢 浮 到數列的頂端,就像燒開了水中的氣泡越往上越大。它的原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,這樣一趟過去後,最大或最小的數字被交換到了最後一位,然後再從頭開始進行兩兩比較交...