氣泡排序的優化與誤區

2022-08-30 09:54:17 字數 1912 閱讀 4838

氣泡排序(bubble sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

氣泡排序演算法的運作如下:

比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

針對所有的元素重複以上的步驟,除了最後乙個。

持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

正常的氣泡排序**:

1

public

class

bubblesort;

4for (int i = 0; i < score.length -1; i++)

11}

12 system.out.print("第" + (i + 1) + "次排序結果:");

13for(int a = 0; a < score.length; a++)

16 system.out.println("");17}

18 system.out.print("最終排序結果:");

19for(int a = 0; a < score.length; a++)22}

23 }

//那麼問題來了?在排序過程中發現後面的元素已經是排好序了,那麼後面的繼續便利就是浪費了,因此增加flag標誌位,進行提前終止

提高演算法的效率

1

/**2

* 原因,當氣泡排序發現元素已經是排序好了的時候,並不會停止這將會浪費時間複雜度。34

* 這裡節省的時間複雜度值得是:減少了for迴圈的次數:比如 經過

5* 第一次冒泡後變為,此時的flag仍為false,然後繼續下一波外層迴圈,flag此時為true了,但是內部for迴圈還是要走一遍

6* 這個是必須的否則就會和第二種優化一樣不夠健壯,在內部for迴圈裡面,沒有一次可以進入if判斷了,說明在已經排好的最大數的前面的陣列已經為有序的了

7* 此時才應該是break,這種優化只是部分上優化了冒泡。8*/

9public

class

bubblesortanalyse 24}

25//

如果上一輪氣泡排序已經全部有序

26//

即flag!=false,則直接退出,不用進行下一輪冒泡迴圈,提高效率,否則陣列已經有序了,他還會繼續冒泡迴圈

27if

(flag)

30//

system.out.println(i);31}

32return

data;33}

3435

//氣泡排序優化,通過flag進行判斷排序是否提前已經結束。

36//

該優化存在缺陷,當最小的數可能還在後面已經排好序的陣列中時就已經停掉了,

37//

38public

static

void bubblesort(int

arr)

5657}58

}59}60

61public

static

void

main(string args) ;

63//

bubblesort(arr);

64int arr2 =sort(arr);

65for (int

i : arr2) 68}

69 }

具體的在**中的注釋已經詳細給出解釋。

氣泡排序與優化

1 排序方法 將被排序的記錄陣列r 1.n 垂直排列,每個記錄r i 看作是重量為r i key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r 凡掃瞄到違反本原則的輕氣泡,就使其向上 飄浮 如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。1 初始 r 1.n 為無序區。2...

C 氣泡排序 氣泡排序的優化

本文包含氣泡排序的三種實現方式 分別為氣泡排序初級版,公升級版,終級版 自己起的名字 使用時只要使用終極版就本以了,終級版為公升級版的優化版本 至於初極版和公升級版只是為了幫助理解 氣泡排序的時間複雜度為o n include include include include include incl...

氣泡排序以及氣泡排序的優化

很早接觸過氣泡排序法,但一直沒有真正的理解,只是為了記住而學習,今天又重新看了一下,其實氣泡排序法第一次排序會把最大的冒到最上面,第二次會把次大的泡冒到最大的後面,一次類推 另外在排序的次數上會逐漸減少。看 void bubble sort int a,int n 其實還可以優化一下,當發現沒有進行...