【算法基础】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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步