JavaScript 实现基数排序

发布于 2024-01-16 09:33:19 字数 1470 浏览 59 评论 0

简介

排序算法时间复杂度是否基于比较
冒泡、插入、选择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]

总结

  1. 基数排序时间复杂度 O(n)
  2. 对排序数据有要求,需要可以分割出独立的「位」来比较,而且位之间有递进的关系,如果 a 比 b 大,那么后面的位就不用比较了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

自由范儿

暂无简介

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文