排序思想:
按照数组最大值的位数进行排序
比如:var arr=1,2,41,42,42,431,563,762
第一次按照各位数的大小,将数组的数装到不同的篮子
0
1:1 41 431
2:2 42 42 762
3 :563
4
5
6
7
8
9
然后将所有的篮子从小到大组合成为一个新的数组为:1 41 431 2 42 42 762 563
第二次按照10位上的数字大小将arr中的数据放进不同的篮子里:如果没有10位上的数字,则放进0的篮子里。
0:1 2
1:41 431
2: 42 42 762
3: 563
4:
5:
6:
7:
8:
9:
然后将篮子里的数据依次组合为新的数组:1 2 41 431 42 42 762 353
因为arr数组中最大位数为3,所以从右到做依次比较到第三位即可,最后篮子组合的数据就是排好序的数组。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
let arr=[1,4,5,22,21,65,66,74,871,21,31,88,564,679];
function radixSort(arr){
//找出循环次数
let max=0;
for(var i=0;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
}
let count=max.toString().length;
//每一次放的篮子,这个篮子是一个二维数组
var bucket=[];
for(var i=0;i<=9;i++) {
bucket[i] = [];
}
//循环位数
for(var i=0;i<count;i++){
let qe=Math.pow(10, (i+1));
//循环数组,放到篮子里
for(var j=0;j<arr.length;j++){
//在位数确定的情况下取得对应位置的数字
if(arr[j].toString().length<i+1){
bucket[0].push(arr[j]);
}else{
bucket[(arr[j]%qe).toString().slice(0,1)].push(arr[j]);
}
}
//循环篮子,把篮子里的数据重新装到arr里面
arr=[];
for(var k=0;k<=9;k++){
arr=arr.concat(bucket[k]);
}
//清空篮子
for(var w=0;w<=9;w++){
bucket[w]=[];
}
}
return arr;
}
let newArr=radixSort(arr);
console.log(newArr)
</script>
</body>
</html>