經典排序算法(一)--- 冒泡排序

冒泡排序

冒泡排序(Bubble Sort)是一種簡單直觀的排序算法。它重複地遍歷要排序的數組,依次比較兩個相鄰的元素大小,如果第一個比第二個大,就交換他們兩個。

算法原理
  • 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  • 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
  • 針對所有的元素重複以上的步驟,除了最後一個。
  • 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
複雜度及穩定性
平均時間複雜度 最優時間複雜度 最壞時間複雜度 空間複雜度 穩定性
O(N^2) O(N) O(N^2) O(1) 穩定
動畫演示

在這裏插入圖片描述

視頻演示

舞動的排序算法之冒泡排序

代碼實現
  1. python

    def bubble_sort(_list):
        for i in range(len(_list)-1):
            for j in range(0, len(_list)-1 - i):
                if _list[j] > _list[j+1]:
                    _list[j], _list[j + 1] = _list[j + 1], _list[j]
        return _list
    
    print(bubble_sort([2, 4,3,10,9, 1, 8, 5, 5]))
    # [1, 2, 3, 4, 5, 5, 8, 9, 10]
    
  2. java

    static int[] bubbleSort(int[] listData) {
        for (int i = 0; i < listData.length; i++) {
            for (int j = 0; j < listData.length - 1 - i; j++) {
                int temp = listData[j];
                if (listData[j] > listData[j + 1]) {
                    listData[j] = listData[j + 1];
                    listData[j + 1] = temp;
                }
            }
        }
        return listData;
    }
    // 查看輸出
    public static void main(String[] args) {
        int[] test = bubbleSort(new int[]{2, 4,3,10,9, 1, 8, 5, 5});
        for (int i: test) {
            System.out.println(i);
        }
    }
    
算法優化

冒泡排序還有一種優化算法,就是立一個 flag,當在一趟序列遍歷中元素沒有發生交換,則證明該序列已經有序。

  1. python

    def bubble_sort(_list):
    	flag = True
        for i in range(len(_list)-1):  
            for j in range(0, len(_list)-1 - i):
                if _list[j] > _list[j+1]:
                    flag = False
                    _list[j], _list[j + 1] = _list[j + 1], _list[j]
            if flag:
                break
        return _list
        
    print(bubble_sort([2, 4,3,10,9, 1, 8, 5, 5]))
    # [1, 2, 3, 4, 5, 5, 8, 9, 10]
    
  2. java

    static int[] bubbleSort(int[] listData) {
    	boolean flag = true;
        for (int i = 0; i < listData.length; i++) {
            for (int j = 0; j < listData.length - 1 - i; j++) {
                int temp = listData[j];
                if (listData[j] > listData[j + 1]) {
                    flag = false;
                    listData[j] = listData[j + 1];
                    listData[j + 1] = temp;
                }
            }
            if (flag){
                break;
            }
        }
        return listData;
    }
    // 查看輸出
    public static void main(String[] args) {
        int[] test = bubbleSort(new int[]{2, 4,3,10,9, 1, 8, 5, 5});
        for (int i: test) {
            System.out.println(i);
        }
    }	
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章