基本排序_冒泡排序_Java實現

轉載請註明出處:http://blog.csdn.net/ljmingcom304/article/details/50341295
本文出自:【樑敬明的博客】

1.冒泡排序

  冒泡排序就是重複的按照特定的順序比較兩兩元素的大小,交換它們,直到最後沒有可以交換的元素爲止。

冒泡排序
 
  如上圖所示,假設一個序列的初始狀態爲【9】【8】【7】【6】【5】,將序列由小到大進行排序,每次進行排序時從後往前依次比較兩個數的大小,將較小的數前置。
  第一次排序,找到最小的數爲5,將其排在序列的第1位。
  第二次排序,找到最小的數爲6,將其排在序列的第2位。
  第三次排序,找到最小的數爲7,將其排在序列的第3位。
  第四次排序,找到最小的數爲8,將其排在序列的第4位。
  只剩最後一個數,不用再次進行比較,直接位於序列最後。

2.示例代碼

  假設對一個長度爲N的序列由小到大進行排序,第i次排序,需要找到最小的數爲m,將其排在序列的第i位,當最終完成排序後需要進行N-1次排序。
  當進行第i次排序時,需要從N與N-1開始從後往前兩兩元素進行比較,直到比較到第i位爲止。
   當元素間進行兩兩比較時,位置不在發生變換,說明此時序列爲有序序列,可以直接結束循環。

public class BubbleSort {

    public static void main(String[] args) {
        int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
        BubbleSort.sort(array);
        System.out.println("排序後數組:" + Arrays.toString(array));
    }

    public static void sort(int[] a) {
        // 用於標誌排序過程中元素是否發生交換
        boolean flag = false;
        for (int i = 0; i < a.length - 1; i++) {
            // 從後向前遍歷依次比較相鄰兩數大小,將較小的數進行前置
            for (int j = a.length - 1; j > i; j--) {
                if (a[j - 1] > a[j]) {
                    a[j] = a[j - 1] + a[j];
                    a[j - 1] = a[j] - a[j - 1];
                    a[j] = a[j] - a[j - 1];
                    flag = true;
                }
            }
            // 若某一輪沒有發生交換,說明是有序數列,直接跳出循環
            if (flag == false)
                break;
            System.out.println(Arrays.toString(a));
        }
    }

}

3.算法分析

時間複雜度:
  若序列的初始狀態處於正序,遍歷一次,不需要交換元素間的位置,即可完成排序,所以比較次數和移動次數均爲最小值。比較次數Cmin=n1 ,移動次數Mmin=0 ,所以冒泡排序的最好時間複雜度爲O(n)
  若序列的初始狀態爲倒序,需要進行n-1次排序,每次排序都需要進行n-i次的比較,都需要移動記錄三次來交換元素位置,所以比較次數和移動次數均爲最大值。比較次數Cmax=n(n1)2=O(n2) ,移動次數Mmax=3n(n1)2=O(n2) ,所以冒泡排序的最壞時間複雜度爲O(n2)
  因此,冒泡排序總的時間複雜度爲O(n2)
算法穩定性:
  冒牌排序是比較相鄰的兩個元素,交換也發生在兩個元素之間,若兩個元素相等,不會發生交換,相同元素的順序不會發生改變。因此,冒泡排序是一種穩定的排序算法。

發佈了39 篇原創文章 · 獲贊 14 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章