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排序算法总结:基数排序的主要内容,如果未能解决你的问题,请参考以下文章