基数排序
基数排序是一种“分配式排序”。它将整数各个位进行切割,按位排序。
基数排序会使用到桶 (Bucket),通过将要比较的位(个位、十位、百位…),将要排序的元素分配至 0~9 个桶中,借以达到排序的作用,在某些时候,基数排序法的效率高于其它的比较性排序法。
实现方法
**最高位优先(Most Significant Digit first)法,简称MSD法:**先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最后一位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。
**最低位优先(Least Significant Digit first)法,简称LSD法:**先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。
实现原理
基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献。它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
算法步骤
- 以LSD为例,首先根据个位数的数值,在遍历数组时将元素分配至编号0到9的桶子中;
- 接下来将这些桶子中的数值重新串接起来(按照先进先出的原则),排列成新的序列;接着再进行一次分配,这次是根据十位数来分配;
- 直到从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
代码实现
var counter = [];
function radixSort(arr,maxDigit){