JavaScript 实现基数排序
简介
排序算法 | 时间复杂度 | 是否基于比较 |
---|---|---|
冒泡、插入、选择 | O(n²) | √ |
快排、归并、希尔、堆 | O(nlogn) | √ |
桶、计数、基数 | O(n) | × |
顾名思义,按照一个基本位,来对数据上的每一位进行排序。比如字符串 abcdefg
,可以对每一位采取计数排序或桶排序进行处理。
代码
function radixSort(arr) { const n = arr.length const m = getMax(arr) for (let exp = 1; Math.floor(m / exp) > 0; exp *= 10) { countingSort(arr, exp) } } function getMax(arr) { let max = arr[0] for (let i = 1; i < arr.length; i++) { if (arr[i] > max) { max = arr[i] } } return max } function countingSort(arr, exp) { const n = arr.length let output = new Array(n) let count = Array.from({length: 10}, _ => 0) for (let i = 0; i < n; i++) { count[Math.floor(arr[i] / exp) % 10]++ } for (let i = 1; i < 10; i++) { count[i] += count[i - 1] } for (let i = n - 1; i >= 0; i--) { output[count[Math.floor(arr[i] / exp) % 10] - 1] = arr[i] count[Math.floor(arr[i] / exp) % 10]-- } for (let i = 0; i < n; i++) { arr[i] = output[i] } } const arr=[170, 45, 75, 90, 802, 24, 2, 66] radixSort(arr) // [2, 24, 45, 66, 75, 90, 170, 802]
总结
- 基数排序时间复杂度 O(n)
- 对排序数据有要求,需要可以分割出独立的「位」来比较,而且位之间有递进的关系,如果 a 比 b 大,那么后面的位就不用比较了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论