JS排序算法总结:(八)基数排序

目的:掌握 基数排序 的 基本思想与过程、代码实现、时间复杂度

1、基本思想与过程:(只针对数字)

  (1)首先确定基数为10,数组的长度也就是10.每个数都会在这10个数中寻找自己的位置。

  (2)不同于BinSort会直接将数放在数组的下标处,如将 [34] 放在下标为34的位置,即a[34] = 34;基数排序是将34分开为3和4,第一轮排序根据最末位放在数组的下标4处,第二轮排序根据倒数第二位放在数组的下

标3处,然后遍历数组即可。

 

2、代码实现:

function RadixLSDSort (arr, digit) {
    const radix = 10;   // 基数,以10进制来进行排序
    var i = 0, 
        j = 0,
        count = Array(radix), // 0~9的桶
        len = arr.length,
        bucket = Array(len);
    // 利用LSD,也就是次位优先
    for (var d = 0; d < digit; d++) {
        for (i = 0; i < radix; i++) {
            count[i] = 0;
        }
        // 向各个桶中添加元素,并统计出每个桶中装的个数
        for (i = 0; i < len; i++) {
            j = getDigit(arr[i], d);
            count[j]++;
        }
        // count的越往后值最大,最大值为arr.length
        // count数组的值为,该位数值为该索引的数字总数
        for (i = 1; i < radix; i++) {
            count[i] = count[i] + count[i - 1];
        }
        // 按照桶的顺序将导入temp中
        for (i = len - 1; i >= 0; i--) {
            j = getDigit(arr[i], d);
            bucket[count[j] - 1] = arr[i];
            count[j]--; 
        }
        // 将已经根据相应位数排好的序列导回arr中
        for (i = 0; i < len; i++) {
            arr[i] = bucket[i];
        }
    }   
    return arr
}

// 获得每位的数字
function getDigit(x,d){
    var a = [ 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000];
    return (Math.floor(x / a[d]) % 10);
}

3、时间复杂度:O(d(n+r),其中:d为待排列数字的最大位数,n为待排序列的长度,r为进制数 

posted @ 2018-09-02 12:39  Cassie_茜  阅读(1430)  评论(0编辑  收藏  举报