• 基数排序


    基数排序

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

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

      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;
          }
        });
      }
    }
    
  • 相关阅读:
    (转)当你输入一个网址,实际会发生什么?
    Word Ladder II
    Jump Game II
    Candy
    [生成树][Uva1395][Slim Span]
    [AC自动机][HDU3065]
    [KMP求最小循环节][HDU3746][Cyclic Nacklace]
    [扩展KMP][HDU3613][Best Reward]
    [Manacher][HDU3613][Best Reward]
    [KMP][HDU3336][Count the string]
  • 原文地址:https://www.cnblogs.com/pengnima/p/12626590.html
Copyright © 2020-2023  润新知