JS写的MSD分配法 排序结果是错的

前端_小柒 2018-03-27 07:54:17
window.onload=function () {
//因为这个数组最大的元素只有三位,所以传入3
console.log(radixSortRise([99,15,48,75,46,37,90,100],3,1000,100));
// console.log(radixSortDown([99,15,48,75,46,37,90,100],3));
}

/**
* JS实现基数排序-升序
* @param arr 待排序数组
* @param maxDigit元素的最大位数
* @param mod和dev取决于最大位数是多少 如果是百位
* mod传入1000 dev传入100
**/
function radixSortRise(arr, maxDigit,mod,dev) {
//创建大桶
var counter = [];

//原数组的元素下标
var pos;

//1.根据元素的最大位数决定LSD分配法的最大分配次数
//2.当前的所有元素的最大位数为3
//3.因为当前的所有元素中最大元素只有三位数,所以最多分配三次
//4.分配三次后即排序完成
for (var i = 0; i < maxDigit; i++, dev =dev/10, mod = mod/10) {
// 把待排序的数组 arr 中的每一位整数,插入对应的容器
for(var j = 0; j < arr.length; j++) {

//1.依次获取每个元素的各个位数,从个位开始获取,直到获取至最大位数
//2.通过位数的数值得到元素要存放的小桶的下标
var bucket = parseInt((arr[j] % mod) /dev);

//1.如果这个小桶下标所对应的小桶不存在
//2.在这个大桶里创建这个下标的小桶
if(counter[bucket]==null) {
counter[bucket] = [];
}
// 把这个元素存放到指定下标的小桶中
counter[bucket].push(arr[j]);
}

//每次进行收集之前,初始化原数组的数组下标
pos = 0;
//升序收集
//从大桶的第一个小桶开始依次每个小桶,并将每个小桶的元素依次放回原数组
for(var j = 0; j < counter.length; j++) {
//如果这个小桶存在
if(counter[j]!=null) {
//取出当前小桶中的第一个元素
var value = counter[j].shift();
//如果这个元素存在则从第一个元素开始依次取出所有元素
while (value != null) {
//将这个元素放入当前的元素位置,并在放完后,继续获取下一个元素位置的下标
arr[pos++] = value;
//获取当前的小桶中的下一个元素,并在获取后将这个元素从小桶删除
value = counter[j].shift();
}
}
}
}
//将排序完成的数组返回到外部
return arr;
}
...全文
1520 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengwei060024 2018-03-28
  • 打赏
  • 举报
回复
代码是ts的,自己找个typescript编译器编译下,或者直接用js文件也可以
zhengwei060024 2018-03-28
  • 打赏
  • 举报
回复
前几天刚写的,基数排序,桶排序都有,自己看吧https://github.com/zhengw060024/algorithmpratice/tree/master/algorithemJs/chapter8

1,092

社区成员

发帖
与我相关
我的任务
社区描述
云计算服务器、网络、虚拟化相关讨论
社区管理员
  • 服务器
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧