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;
    }