十大排序之基数排序 JS算法

 包含最大位算法,细节都在注释里

function radixSort(arr) {
   // 先找最大值的位数maxDigit ,确定循环次数
   let maxDigit = 1;
   let mod = 10;
   while (arr.some(v => v > mod)) {  // 用内置函数some,可优化
      mod *= 10;
      maxDigit += 1;
   }

   // for (let i of arr) {       // 优化后
   //    while (i > mod) {
   //       mod *= 10;
   //       maxDigit += 1;
   //    }
   // }

   mod = 10;
   let vessel = [];// 所有的桶放在这里   
   // 一轮高一位;10变100,100变1000  
   for (let i = 0; i < maxDigit; i++, mod *= 10) {
      // 装桶
      for (let j = 0; j < arr.length; j++) {
         // 1978%100/10  找十位 7
         // 25486%10000/1000 找千位 5
         let bucket = Math.floor(arr[j] % mod / (mod / 10));
         if (vessel[bucket] == null) {// 如果为空,初始化
            vessel[bucket] = [];// 数组的元素是数组,对应一个桶
         }
         vessel[bucket].push(arr[j]);
      }
      // 填充数组
      let pos = 0; // 用来填充的指示下标
      for (j = 0; j < vessel.length; j++) {
         var value = null;

         if (vessel[j] != null) {// 如果该桶有数,取
            while ((value = vessel[j].shift()) != null) {// 桶里的数未取完
               arr[pos++] = value;
            }
         }
      }
   }
   return arr;
}

借鉴自  十大经典排序算法(动图演示) - 一像素 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值