多一些Aha Time,发现技术的美妙🍺|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【算法基础】16.十大排序算法——基数排序

参考资料

基数排序https://zhuanlan.zhihu.com/p/417627983

基数排序算法详解https://blog.csdn.net/qq_35344198/article/details/107615053

 

直观理解

将元素的值按不同的权重等级分别比较,比如比较日期时先比较年、再比较月、最后比较日

 

 

 

例子先行

 参考代码

复制代码
 1 // 基数排序
 2 function sort(arr, maxLength) {
 3     // 用于存储每次按位排序结果
 4     let sortArr = [];
 5 
 6     // 从低位开始比较
 7     for (let i = maxLength - 1; i >= 0; i--) {
 8         // 填充计数数组
 9         let countArr = [];
10         for (let item of arr) {
11             let index = getCharIndex(item, i);
12             if (!countArr[index]) {
13                 countArr[index] = 0;
14             }
15             countArr[index]++;
16         }
17 
18         // 计数数组形变,后面的元素等于前面的元素之和
19         let sum = 0;
20         for (let j = 0; j < countArr.length; j++) {
21             if (!countArr[j]) {
22                 countArr[j] = 0;
23             }
24             sum += countArr[j];
25             countArr[j] = sum;
26         }
27 
28         // 倒序遍历计数数组,从计数数组中找到正确位置,输入到输出数组
29         for (let j = arr.length - 1; j >= 0; j--) {
30             let index = getCharIndex(arr[j], i);
31             sortArr[countArr[index] - 1] = arr[j];
32             countArr[index]--;
33         }
34         arr = Object.assign([], sortArr);
35     }
36     return arr;
37 }
38 
39 function getCharIndex(str, index) {
40     if (str.length < index + 1) {
41         return 0;
42     }
43     return str.charCodeAt(index);
44 }
45 
46 let arr = ['cni', 'efz', 'omv', 'kbv', 'pl', 'acj', 'agd', 'ef'];
47 let sortArr = sort(arr, 3);
48 console.log(sortArr);
复制代码

 

总结提炼

1基数排序也是线性时间排序的一种。同样的局限性也大。并且也需要更多的辅助空间来帮助排序。并且也是使用到了桶排序的思想;

2基数排序对所有数中的每一位数进行从小到大的分别排序。将权重相同位数上的值分到一组,然后对这进行排序。

然后对下一位权重更高的位数进行排序。这次的排序是基于上一次的排序。如果相等的话,不改变原本的顺序。如果不想等的话会覆盖之前的顺序。

从这个方面可以看出,对每一组进行排序的这个排序算法要求必须是稳定的 。其要保证当值相等的时候,相对位置的顺序不变。(这也算是排序稳定性的一种应用)

3时空复杂度与稳定性

时间复杂度:计数排序算法的时间复杂度是O(N+M),基数排序算法执行了k次计数排序,所以基数排序算法的时间复杂度为O(K(N+M))

空间复杂度:计数排序算法的空间复杂度是O(N+M),M是桶的空间,可重复利用

稳定性:基于稳定的计数排序,所以也是稳定的

 

拓展方向

 权重排序是不是和图规划有关

本文作者:OhOfCourse

本文链接:https://www.cnblogs.com/OhOfCourse/p/16919513.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起