冒泡 bubble 排序演算法

2021-07-15 00:01:50 字數 1780 閱讀 9505

氣泡排序是穩定的排序演算法。

1、氣泡排序演算法的基本思想

氣泡排序的方法為:將被排序的記錄陣列a[1...n]垂直排列,每個記錄a[i]看做重量為a[i]氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列a:凡是掃瞄到違反本原則的輕氣泡,就是其向上「漂浮」。如此反覆進行,知道最後任何兩個氣泡都是輕者在上、重者在下為止。

氣泡排序是穩定的排序。下面是具體的演算法。

(1) 初始狀態下,a[1...n]為無序區。

(2) 第一趟掃瞄:從無序區底部向上一次比較相鄰的兩個氣泡的中糧,若發現輕者在下、重者在上,則交換二者的位置。記一次比較(a[n],a[n-1]),(a[n-1],a[n-2]),...,(a[2],a[1]);對於沒對氣泡(a[j+1],a[j]),若a[j+1]第一趟掃瞄完畢之後,「最輕」的氣泡就漂浮到該區間的頂端,即關鍵字最小的記錄被放在最高位置a[1]的位置上。

(3) 第二趟掃瞄:掃瞄a[2...n]。掃瞄完畢時,「次輕」的期票漂浮到a[2]的位置上。

(4) 第i趟掃瞄:a[1...i-1]和a[i...n]分別為當前的有序區和無序區。掃瞄仍是從無序區底部向上,直至該去頂部。掃瞄完畢時,該區重最輕氣泡漂浮到頂部位置a[i]上,結果是a[1...i]變為新的有序區。

(5) 最後,經過n-1趟掃瞄可得到有序區a[1...n];

2、思想

通過無序區中相鄰記錄關鍵字間的比較和位置的交換,使關鍵字最小的記錄如氣泡一般逐漸往上「漂浮」直至「水面」。 

3、時間複雜度

最好情況下:正序有序,則只需要比較n次。故,為o(n)

最壞情況下:  逆序有序,則需要比較(n-1)+(n-2)+……+1,故,為o(n*n)

4、穩定性

排序過程中只交換相鄰兩個元素的位置。因此,當兩個數相等時,是沒必要交換兩個數的位置的。所以,它們的相對位置並沒有改變,氣泡排序演算法是穩定的!

5、**實現:

//程式設計實現氣泡排序

//1、氣泡排序每次會把最小的數以冒泡的方式冒上來。

//2、每次從最後乙個數開始,與前面的數進行兩兩比較,後大於前,進行兩兩交換。每次就可以冒泡出最小的數。

//3、所以內層迴圈為從最後乙個開始j=len-1,迴圈條件是冒泡到i的位置(因為i前面的已經冒過),j--。

#includeusing namespace std;

void bubble_sort_1(int a, int len)

} }}void bubble_sort_2(int a, int len)

} if (exchange != 1) //此趟掃瞄沒有發生過交換,說明順序已經是排序好的了

return; //不需要進行後面的掃瞄 }}

static void print_array(int a, int len)

}void main9main****i3()

; cout << "before bubble_sort:";

print_array(a, 9);

bubble_sort_2(a, 9);

cout << "\nafter bubble_sort:";

print_array(a, 9);

system("pause");

}

6、測試結果

before bubble_sort:7 3 5 8 9 1 2 4 6

after bubble_sort:1 2 3 4 5 6 7 8 9

演算法algorithm 冒泡(bubble)排序

待排序的陣列元素依次兩兩比較,如果前面的大於後面的,則進行交換 public static void main string args sort arr system.out.println arrays.tostring arr private static void sort int arr p...

事件冒泡 比bubble

冒泡的概念就是 當子元素觸發事件的時候 相應的祖宗十八代素也會觸發相同的事件 前提父元素也新增了一樣的事件 eg 兒子 有乙個onclick 祖宗十八代 也有onclick 當點選兒子的時候 祖宗十八代的點選事件也會被觸發 有時候這種情況會導致很多問題 所以要阻止冒泡 只有被點選的元素才觸發事件 不...

資料結構中的排序 冒泡(bubble)排序

氣泡排序的思路 以公升序為例,將數列中的第乙個數拿出來,依次後後面的比較,如果比後面的數大,那麼久交換,直到比較到最後乙個,當這一趟比較結束後,第乙個數就是最小的。然後再取第二個數,同樣的依次和後面的數比較,比較結束後,這個資料就是第二小的,後面的就是依次類推。c語言中兩個for迴圈即可實現。inc...