基数排序
不需要比较,基于 分配 + 收集 的思想。
-
思路: 桶实际上是队列,先进先出
- 建 10 个 桶,分别为 0~9
- 第一趟分配(按 个位 排),把数丢到 桶里
- 然后 收集回来(回来之后会发现 数的个位为有序的了)
- 第二趟分配(按 十位 排)
- 然后 收集回来(回来之后会发现 数的十位为有序的了)
- 第三趟分配(按 百位 排)
- 然后 收集回来(回来之后会发现 数的百位为有序的了)
最高位有序后,同最高位的 第二位也有序,其余同理
-
时间复杂度: 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;
}
});
}
}