基数排序

158 阅读2分钟

排序思想:

按照数组最大值的位数进行排序

比如: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>