概念
将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
算法原理
-
假设有如下原始数组:
[102,25,99,82,289,1,20,146,66,5]
-
第一轮排序
-
2.1 取出每个数的个位数,依次放到桶里。
例如:102放到第2个桶,25放到第5个桶,99放到第9个桶,后面数字一次类推。结果如下图: -
2.2 按照桶的顺序依次取出数据,放入到原数组。结果如下:
- 第二轮排序
- 3.1.取出每个数的十位数,依次放到桶里,结果如下:
- 3.2 按照桶的顺序依次取出数据,放入到原数组。结果如下:
- 第三轮排序
-
4.1.取出每个数的百位数,依次放到桶里,结果如下:
-
4.2 按照桶的顺序依次取出数据,放入到原数组。结果如下:
此时数组已经排好序了。
算法代码
function radixSort(arr) {
// 定义10个桶,是一个二维数组
let bucketArr = Array(10).fill().map(() => [])
// 每个桶已放入的数据个数
let bucketItemCounts = Array(10).fill(0)
// 取出最大值
let max = arr[0]
for (let i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i]
}
}
// 最大值的位数
let digitCount = `${max}`.length
for (let i = 0, n = 1; i < digitCount; i++, n *= 10) {
for (let j = 0; j < arr.length; j++) {
let digitOfItem = ~~(arr[j] / n % 10)
bucketArr[digitOfItem][bucketItemCounts[digitOfItem]] = arr[j]
// 桶里的数据个数+1
bucketItemCounts[digitOfItem]++
}
// 遍历桶里面的数据
let index = 0
for(let bucketItems of bucketArr) {
for (let item of bucketItems) {
arr[index++] = item
}
}
// 需要重置
bucketArr = Array(10).fill().map(() => [])
bucketItemCounts = Array(10).fill(0)
}
}