排序算法(六):桶排序

概念

桶排序:取 n 個桶,根據數組的最大值和最小值確認每個桶存放的數的區間,將數組元素插入到相應的桶裏,最後再合併各個桶

複雜度

最好:O(n),每個數都在分佈在一個桶裏,這樣就不用將數插入排序到桶裏了(類似於計數排序以空間換時間)。

最壞:O(n²),所有的數都分佈在一個桶裏。

平均:O(n + k),k表示桶的個數。

代碼

  // 桶算法
    function bucket_sort(arr) {
      let bucket = 10
      let max = Math.max(...arr)
      let min = Math.min(...arr)

      // 計算每個桶存放的數值範圍,至少爲1
      let range = Math.ceil((max - min) / bucket) || 1;

      // 創建二維數組,第一維表示第幾個桶,第二維表示該桶裏存放的數
      let bucket_arr = Array.from(Array(bucket)).map(() => Array().fill(0));

      arr.forEach(val => {
        // 計算元素應該分佈在哪個桶
        let index = parseInt((val - min) / range);
        // 防止index越界,例如當[5,1,1,2,0,0]時index會出現5
        index = index >= bucket ? bucket - 1 : index;

        let temp = bucket_arr[index];
        // 插入排序,將元素有序插入到桶中
        let j = temp.length - 1;
        while (j >= 0 && val < temp[j]) {
          temp[j + 1] = temp[j];
          j--;
        }
        temp[j + 1] = val;
      });
      // 修改回原數組
      let res = [].concat.apply([], bucket_arr);
      arr.forEach((val, i) => {
        arr[i] = res[i];
      })
    }

    var sortArr = [9, 6, 3, 5, 2, 1, 7, 343, 6, 643, 243, 544, 5, 63, 234, 0, 56, 123]
    bucket_sort(sortArr)
    console.log(sortArr)
    // [0, 1, 2, 3, 5, 5, 6, 6, 7, 9, 56, 63, 123, 234, 243, 343, 544, 643]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章