天天看點

js冒泡排序的個人了解

js冒泡排序

冒泡排序:指的是對一個數值數組進行從小到大的排序操作。

數組元素總個數為arr.length

- 輪數為arr.length - 1

- 每輪的比較次數不同:呈現依次遞減的形式

關于冒泡排序的作用:友善數組資料的排序。

例如:使用數組進行數字的排序

var arr = [1, 2, 4, 3];
        var count = 0;

        // 設定一個循環用于控制比較的輪數
        for (var i = 0; i < arr.length - 1; i++) {
            count++;
            // 設定内層循環用于控制每輪中的比較次數
            for (var j = 0; j < arr.length - i - 1; j++) {
                // 比大小
                //   - 大小于的比較控制排序方式:如果為大于号,為升序,小于号表示降序
                if (arr[j] > arr[j + 1]) {
                    // 交換兩個位置的值
                    var temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        console.log(arr, count);
           

小結:

  • 這樣雖然可以周遊出,數組的大小,但一直執行下去,會多出一些不必要的循環,
  • 下面例子會改進一下,提高效率。

如何改進呢?

問題:任意的數組進行排序時,根據設定都需要進行length - 1輪的比較操作
        - 有時候可能并不需要進行所有輪的比較,就可以排序完畢
        - 如果可以在排序完畢的時候就進行結束,可以優化一些性能
        方式:
             - 需要檢測排序過程中,哪一輪可以确定排序完畢了
             - 如果某一輪的所有次比較時都沒有進行交換操作(沒進入if),說明排序完畢
             - 我們需要知道某一輪是否進入過if,等比較執行完畢,确定一下進入if的情況即可
           
var arr = [1, 2, 4, 3, 5, 6, 7, 8, 9];
        var count = 0;

        // 設定一個循環用于控制比較的輪數
        for (var i = 0; i < arr.length - 1; i++) {
            count++;
             // 設定一個變量用于标記,true表示沒有進入過if的狀态,false代表了進入過if
             var bool = true;

            // 設定内層循環用于控制每輪中的比較次數
            for (var j = 0; j < arr.length - i - 1; j++) {
                // 比大小
                //   - 大小于的比較控制排序方式:如果為大于号,為升序,小于号表示降序
                if (arr[j] > arr[j + 1]) {
                    // 交換兩個位置的值
                    var temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;

                    bool = false;
                }
            }
            // 必須在目前輪所有比較都執行完畢後,再判斷if的進入情況(書寫在内層for後面)
            if (bool) {
                // 隻有bool為true的時候才能進入内部執行代碼
                break; // 結束循環執行
            }

        }
        console.log(arr, count);
           

思考:

上面的改進中通過變量控制操作判斷了if的進入狀态
        - 使用的注意點:
        - 變量叫什麼名字和儲存什麼值都無所謂,通常名稱為bool或flag,值通常為布爾類型
        - 設定時必須明确每個值代表的含義。

           

繼續閱讀