js排序算法详解-基数排序
2017-09-21 20:19
218 查看
全栈工程师开发手册 (作者:栾鹏)
js系列教程5-数据结构和算法全解
但是基数排序也有个弊端,就是必须知道最高位有多少位。
附动图:
基数排序 vs 计数排序 vs 桶排序
这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:
1.基数排序:根据键值的每位数字来分配桶
2.计数排序:每个桶只存储单一键值
3.桶排序:每个桶存储一定范围的数值
js系列教程5-数据结构和算法全解
js排序算法详解-基数排序
其实基数排序和桶排序挺类似的,都是找一个容器把属于同一类的元素装起来,然后进行排序。可以把基数排序类比成已知该序列的最高位,然后以除去相对来说的最低位(可能是个位,可能是十位)剩余的位数为桶数,这样一来步长就是10或者100了。但是基数排序相对桶排序又有多了一个亮点,那就是基数排序是先排最低位(个位),把最低位一致的放在一个桶里,然后依次取出,再进一位(十位),把十位相同的再放到一个桶里,然后再取出,这样经过两次重排序就能得到百位以内的排序序列了,百位,千位也是如此。/** * 基数排序适用于: * (1)数据范围较小,建议在小于1000 * (2)每个数值都要大于等于0 * @author damonare * @param arr 待排序数组 * @param maxDigit 最大位数 */ //LSD Radix Sort function radixSort(arr, maxDigit) { var mod = 10; var dev = 1; var counter = []; console.time('基数排序耗时'); for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) { for(var j = 0; j < arr.length; j++) { var bucket = parseInt((arr[j] % mod) / dev); if(counter[bucket]== null) { counter[bucket] = []; } counter[bucket].push(arr[j]); } var pos = 0; for(var j = 0; j < counter.length; j++) { var value = null; if(counter[j]!=null) { while ((value = counter[j].shift()) != null) { arr[pos++] = value; } } } } console.timeEnd('基数排序耗时'); return arr; } var arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]; console.log(radixSort(arr,2)); //[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50];
但是基数排序也有个弊端,就是必须知道最高位有多少位。
附动图:
基数排序 vs 计数排序 vs 桶排序
这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:
1.基数排序:根据键值的每位数字来分配桶
2.计数排序:每个桶只存储单一键值
3.桶排序:每个桶存储一定范围的数值
相关文章推荐
- js排序算法详解-插入排序
- js排序算法详解-希尔排序
- js排序算法详解-归并排序
- 8-3.基数排序详解
- js排序算法详解-快速排序
- js排序算法详解-堆排序
- js排序算法详解-计数排序
- js排序算法详解-桶排序
- 基数排序(LSD+MSD)详解
- 基数排序与桶排序,计数排序【详解】
- 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现
- [034]八大排序算法详解——基数排序
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 基数排序详解以及java实现
- js排序算法详解-冒泡排序
- 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现
- 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现
- js排序算法详解-选择排序
- SetWindowsHookEx()详解
- sed命令详解