仅仅提供代码实现,原理请问度娘。
1、 数据和工具类
module.exports.list = [9, 3, 4, 32, 42, 3, 45, 33, 2, 76, 89, 34];
module.exports.swap = function (list, i, j) {
let temp = list[i];
list[i] = list[j];
list[j] = temp;
};
module.exports.display = function (list) {
let str = "";
for (let i = 0; i < list.length; i++) {
str += list[i] + ", ";
}
console.log(str.replace(/, $/, ""));
};
2、基数排序实现
/**
* 基数排序
*/
const { list, swap, display } = require("./utils/common");
function radioSort(list) {
if (!list || list.length <= 1) {
return;
}
//1、先获取 list 中数据的最大最小值
let min = list[0];
let max = min;
for (let i = 0; i < list.length; i++) {
if (min > list[i]) {
min = list[i];
}
if (max < list[i]) {
max = list[i];
}
}
let absMax = Math.max(Math.abs(min), Math.abs(max));
let base = 1;
while (true) {
let result = Math.trunc(absMax / base);
if (result <= 0) {
break;
}
list = startSort(list, base);
base *= 10;
}
return list;
}
function startSort(list, base) {
let bucketCount = 10;
let bucketList = [];
for (let i = 0; i < bucketCount; i++) {
bucketList.push([]);
}
for (let i = 0; i < list.length; i++) {
let value = list[i];
let key = Math.trunc((value / base) % 10);
bucketList[key].push(value);
}
//将所有的桶的内容合并
let resultList = [];
for (let i = 0; i < bucketCount; i++) {
let subList = bucketList[i];
resultList.push(...subList);
}
console.log("resultList", resultList);
return resultList;
}
let resultList = radioSort(list);
display(resultList);