首页 > 编程学习 > js基数排序

js基数排序

发布时间:2022/9/9 15:01:32

**基数排序**
 核心思想:
  对排序数据进行个位、十位、百位...的拆分(类似于桶排序的分组),先对个位比较排序,排完后再对十位比较排序,直到比较的位数大于最大值时,返回结果。

let arr = [1,-8,6,-50,34,15,-12,42,48,30,11];
    let arrMin = Math.min(...arr);//获取当前数据最大值
    let arrMax = Math.max(...arr);//获取当前数据最小值
    let arr_=[];//每阶段比较后临时存储排序
    let remainder = 10;//取余
    let integer = 1;//取整
    for(let i = 0;i<arr.length;i++){//先对数据进行负数取正操作(方便后面进行比较排序)
        arr[i] = arr[i]-arrMin;
    }
    for(let j = 10;j<(arrMax-arrMin)*10;j*=10,remainder*=10,integer*=10){//判断阶段循环结束,即:数组最大数为80,那么位数判断一定为十位,不可能到百位
        for(let i = 0;i<arr.length;i++){//进行每一位的获取和比较
            let d = Math.floor(arr[i]/integer%remainder)//获得当前位的值
            if(arr_[d]==null) {//判断临时数组是否为空
                arr_[d] = [];
            }
            arr_[d].push(arr[i]);
        }
        let arrd=[];
        for(let p =0;p<arr_.length;p++){//每一轮位数比较参生的新数组赋值回原数组
            if(arr_[p]){
                arrd = [...arrd,...arr_[p]];
            }
        }
        arr=arrd;
        arr_=[];
    };
    let dataArr=[];
    arr.forEach(item=>dataArr.push(item+arrMin))//进行数组转回
    console.log(dataArr);

 

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号