就是计数排序改进版
'use strict'
var arr = [1010, 1000, 999, 666, 444, 333, 333, 123, 50, 22, 12, 10, 5, 2, 1, 0, 0];
function radixSort(arr, numLenght) {
function strLenght(str) {
var str = str.toString();
return str.length;
}
var resultArr = [],
count = 0,
mo = 10,
yu = 1;
// 控制 计数排序的次数
while (numLenght) {
// 总是初始化一个临时数组
let tmpArr = [];
var arrLenght = arr.length;
// arr 数组索引i值, 元素的最少长度 1
var i = 0, strL = 1;
// 计数排序
while (arrLenght) {
arrLenght--;
count += 1;
// 不足位的元素 用 0 补位
let index = Math.floor((arr[i] % mo) / yu);
// 等于0时, 已经有序. splice元素,并追加到排序好的数组末尾.
// 减少待排序元素个数, 优化性能.
if (index == 0) {
if (strL == strLenght(arr[i])) {
resultArr.push(arr.splice(i, 1)[0]);
continue
// splice 元素后,数组总长度减少1,索引i值 不增长, 跳出本次循环.
}
}
// 不是数组时, 初始化为空数组
if (!tmpArr[index]) {
tmpArr[index] = [];
}
// 二维数组 添加元素
tmpArr[index].push(arr[i]);
// arr 数组索引自增
i++;
}
console.log(count);
arr = [];
// 从二维数组中, 按顺序 push 到新空数组中, 准备下次 计数排序
for (let i = 0; i < tmpArr.length; i++) {
var innerArr = tmpArr[i];
if (innerArr) {
for (let v of innerArr) {
arr.push(v);
// count += 1;
}
}
}
mo *= 10, yu *= 10, numLenght--, strL++;
// 数字位数 自减到等于0时, arr 数组已经有序, 合并即可
if (numLenght == 0) {
resultArr = resultArr.concat(arr);
}
// console.log(resultArr);
}
console.log(count);
return resultArr;
}
console.log(radixSort(arr, 4));