JS排序算法总结:基数排序

Posted cassiehouse

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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为进制数 

以上是关于JS排序算法总结:基数排序的主要内容,如果未能解决你的问题,请参考以下文章

基础排序算法总结(代码+图片分析)

十大排序总结(js实现稳定性内外部排序区别时间空间复杂度冒泡快速直接选择堆直接插入希尔桶基数归并计数排序)

数据结构学习笔记——基数排序 | 排序算法总结

数据结构学习笔记——基数排序 | 排序算法总结

数据结构学习笔记——基数排序和排序算法总结

算法——排序算法个人总结