基数排序

基数排序

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

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

    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;
      }
    });
  }
}
posted @ 2020-04-03 15:04  彭尼玛  阅读(111)  评论(0编辑  收藏  举报