zoukankan      html  css  js  c++  java
  • 基数排序

    基数排序

    不需要比较,基于 分配 + 收集 的思想。

    • 思路: 桶实际上是队列,先进先出

      1. 建 10 个 桶,分别为 0~9
      2. 第一趟分配(按 个位 排),把数丢到 桶里
      3. 然后 收集回来(回来之后会发现 数的个位为有序的了)
      4. 第二趟分配(按 十位 排)
      5. 然后 收集回来(回来之后会发现 数的十位为有序的了)
      6. 第三趟分配(按 百位 排)
      7. 然后 收集回来(回来之后会发现 数的百位为有序的了)

        最高位有序后,同最高位的 第二位也有序,其余同理

    • 时间复杂度: O(k (n+m)) ,k 为关键字个数(分配 k 躺),m 为关键字取值范围(桶的个数)

    • 空间复杂度: O(m)

    let buckets = [];
    function radixSort(list, maxDigit) {
      // maxDigit为最大位数
      let mod = 1;
    
      for (let i = 0; i < maxDigit; ++i, mod *= 10) {
        // 分配
        for (let j = 0; j < list.length; ++j) {
          let num = Math.floor((list[j] / mod) % 10);
          if (buckets[num] == null) {
            buckets[num] = [];
          }
          buckets[num].push(list[j]);
        }
    
        //收集
        let k = 0;
        buckets.forEach(bucket => {
          let value = null;
          while ((value = bucket.shift()) != null) {
            list[k++] = value;
          }
        });
      }
    }
    
  • 相关阅读:
    2020.11.17
    2020.11.26
    2020.11.18
    2020.12.01
    2020.11.23
    Java编程规范
    20201003 千锤百炼软工人
    2020081920200825 千锤百炼软工人
    20201004 千锤百炼软工人
    20200929 动手动脑
  • 原文地址:https://www.cnblogs.com/pengnima/p/12626590.html
Copyright © 2011-2022 走看看