基数排序,最先开始以为很复杂,其实就是正对正整数,先按照个位数大小对数组进行排序,再百位、千位、万位……
基数排序 (Radix Sort) 其原理是将整数按位数切割成不同的数字,然后对每个位数上的数字进行分别比较。
这种排序算法可以可以追溯到1887年赫尔曼·霍勒里斯在制表机上的工作,它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
基数排序是一种非比较的整数排序算法,属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序。
这三种排序算法都利用了桶的概念,都属于非比较排序。非比较排序是通过确定每个元素之前,应该有多少个元素来排序。针对数组arr,计算arr[i]之前有多少个元素,则唯一确定了arr[i]在排序后数组中的位置。
但对桶的使用方法上有明显差异:
这里个人总结下(对于整数排序):
对比排序
快速排序图解
归并排序图解
希尔排序图解
再次回到话题本身,基数排序
通过基数排序对数组{53, 3, 542, 748, 14, 214, 154, 63, 616},它的示意图如下:
基数排序是将一个数分成几个部分,分别从后往前将每部分排序,其他部分作为卫星数据连带进行排序。
对于整数而言,因为每一位的大小都是0~9,因此可以对每一次使用计数排序,从而对任意整数进行排序。
假设需要排序的数位数d,因此如果对每一位都使用计数排序的话,总的时间复杂度为o(dn)
时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
例如,我们要把52张四种花色的扑克牌进行依次从小到大的排序,其中黑桃<红桃<方片<梅花。
这个问题的话,关键字为0~K和花色,而且花色的优先级大于数字,所以我们要先选择数字0~K先做一次排序,也就是分13个桶,分为标记为0~K,这样每个桶内就存在不同的四张花色的牌,这样我们收集起来了,然后我们再分4个桶,标记为不同的花色,然后把13个标记为数字的桶中的扑克牌依次放进这些桶内,最终我们可以不通过比较数字的大小和花色,就可以得到排序的结果了。
基数排序动画gif动画演示
基数排序有两种排序方式:LSD和MSD,最小位优先(从右边开始)和最大位优先(从左边开始)
LSD 的排序方式由键值的最右边开始,而 MSD 则相反,由键值的最左边开始。
基数排序JavaScript 算术实现起来,代码非常简洁
/**
* 基数排序,正整数
* @param arr {[Number]} 待排序数组
* @param precision {Number} 数组最大数字位数
*/
function radixSort (arr, precision) {
for (let i = 0; i < precision + 1; i++) {
// 分个、十、百、千……位,针对每个位数的数字大小,对数组进行排序。个位除1,十位除10,百位除100……
let buckets = []
let digit = Math.pow(10, i)
for (let i = 0; i < arr.length; i++) {
let index = Math.floor(arr[i] / digit)
if (buckets[index] === undefined) {
buckets[index] = [arr[i]]
} else {
buckets[index].push(arr[i])
}
}
arr = [].concat(...buckets)
}
return arr
}
针对负数的,待续……
参考文章:
转载自:cococo点点 http://www.cnblogs.com/coder2012
排序之计数排序,基数排序和桶排序 https://www.cnblogs.com/jiangfan95/p/11498625.html
【排序算法(七)】基数排序 https://blog.csdn.net/qq_41900081/article/details/86831408
基数排序 radix sort https://www.jianshu.com/p/8340dfaea3af
转载本站文章《再谈基数排序-分治思想:对比计数|基数|桶|堆|希尔|快速|归并》, 请注明出处:https://www.zhoulujun.cn/html/theory/algorithm/SortingAlgorithms/8279.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。