包含最大位算法,细节都在注释里
function radixSort(arr) {
// 先找最大值的位数maxDigit ,确定循环次数
let maxDigit = 1;
let mod = 10;
while (arr.some(v => v > mod)) { // 用内置函数some,可优化
mod *= 10;
maxDigit += 1;
}
// for (let i of arr) { // 优化后
// while (i > mod) {
// mod *= 10;
// maxDigit += 1;
// }
// }
mod = 10;
let vessel = [];// 所有的桶放在这里
// 一轮高一位;10变100,100变1000
for (let i = 0; i < maxDigit; i++, mod *= 10) {
// 装桶
for (let j = 0; j < arr.length; j++) {
// 1978%100/10 找十位 7
// 25486%10000/1000 找千位 5
let bucket = Math.floor(arr[j] % mod / (mod / 10));
if (vessel[bucket] == null) {// 如果为空,初始化
vessel[bucket] = [];// 数组的元素是数组,对应一个桶
}
vessel[bucket].push(arr[j]);
}
// 填充数组
let pos = 0; // 用来填充的指示下标
for (j = 0; j < vessel.length; j++) {
var value = null;
if (vessel[j] != null) {// 如果该桶有数,取
while ((value = vessel[j].shift()) != null) {// 桶里的数未取完
arr[pos++] = value;
}
}
}
}
return arr;
}