數據結構(四十二)冒泡排序(O(n²))
阿新 • • 發佈:2018-07-11
stat wid 簡單的 逆序 其他 pub sta 進入 交換排序
一、冒泡排序的定義
冒泡排序(Bubble Sort)是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。
二、冒泡排序的實現
1.非標準冒泡排序算法--最簡單的交換排序
思想就是讓每一個關鍵字,都和它後面的每一個關鍵字比較,如果大則交換,這樣第一位置的關鍵字在一次循環後一定變成最小值。
然而缺陷就是,在排序號1和2之後,數字3反而到了最後一位。
// 不是標準的冒泡排序算法,因為它不滿足"兩兩比較相鄰記錄"的冒泡排序思想,是最簡單的交換排序而已。 public static void BubbleSort0(int[] L) { for (int i = 0; i < L.length; i++) { for (int j = i + 1; j < L.length; j++) { if (L[i] > L[j]) { Assistant_And_Test.swap(L, i, j); } } } }
int[] array2 = {9,1,5,8,3,7,4,6,2};
當i=0時,9與1交換,因為1比其他位置的數字都小,所以1在第0位
當i=1時,9與5交換,5與3交換,3與2交換,所以2在第1位
...
2.標準冒泡排序算法
// 標準的冒泡排序算法 public static void BubbleSort1(int[] L) { for (int i = 0; i < L.length; i++) { for (int j = L.length - 2; j >= i; j--) { if (L[j] > L[j + 1]) { swap(L, j, j + 1); } } } }
int[] array2 = {9,1,5,8,3,7,4,6,2};
當i=0時,j從7開始,6與2交換,4與2交換,7與2交換,3與2交換,8與2交換,5與2交換,9與1交換,1排在第0位,2的位置也上升了
當i=1時,j從7開始,7與4交換,8與3交換,9與2交換,2排在第1位,3和4的位置也上升了
...
3.改進的冒泡排序
假設待排序的序列為{2,1,3,4,5,6,7,8,9},當i=0時,交換2和1,此時序列已經有序,但是算法仍然將i=1到8以及每個循環中的j循環都執行了一遍,盡管並沒有交換數據,但是之後的大量比較還是大大多余了。因此,增加一個標記變量flag來實現這一算法的改進。
// 改進的冒泡排序算法,增加一個標記變量flag public static void BubbleSort2(int[] L) { boolean flag = true; // 用flag來做標記 for (int i = 0; i < L.length && flag; i++) { flag = false; // 初始值為false for (int j = L.length - 2; j >= i; j--) { if (L[j] > L[j + 1]) { swap(L, j, j + 1); flag = true;// 如果有數據交換,則flag為true } } } }
int[] array3 = {2,1,3,4,5,6,7,8,9};
i=0,flag=false,j=7開始,8和9不交換,7和8不交換,...2和1交換,flag=true,進入for循環
i=1,flag=false,j=7開始,沒有交換的,所以flag仍然等於false,不進入for循環,
...
三、冒泡排序算法的時間復雜度
對於改進的冒泡排序來說,如果待排序的序列本身就是有序的,那麽需要比較n-1次,交換0次,時間復雜度為O(n)。最壞的情況,即待排序的序列是逆序的情況下,此時需要比較1+2+3+...+(n-1) = n(n-1)/2次,並移動n(n-1)/2次,所以總的時間復雜度為O(n2)
數據結構(四十二)冒泡排序(O(n²))