十大排序算法(JavaScript实现 )- 基数排序 Radix Sort

148 阅读2分钟
  1. 十大排序算法(JavaScript实现 )- 冒泡排序 Bubble Sort

  2. 十大排序算法(JavaScript实现 )- 选择排序 Selection Sort

  3. 十大排序算法(JavaScript实现 )- 插入排序 Insertion Sort

  4. 十大排序算法(JavaScript实现 )- 希尔排序 Shell Sort

  5. 十大排序算法(JavaScript实现 )- 快速排序 Quick Sort

  6. 十大排序算法(JavaScript实现 )- 归并排序  Merge Sort

  7. 十大排序算法(JavaScript实现 )- 计数排序 Count Sort

  8. 十大排序算法(JavaScript实现 )- 桶排序 Bucket Sort

  9. 十大排序算法(JavaScript实现 )- 基数排序 Radix Sort

  10. 十大排序算法(JavaScript实现 )- 堆排序 Heap Sort

概念

将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

算法原理

  1. 假设有如下原始数组:[102,25,99,82,289,1,20,146,66,5] 图片.png

  2. 第一轮排序

  • 2.1 取出每个数的个位数,依次放到桶里。
    例如:102放到第2个桶,25放到第5个桶,99放到第9个桶,后面数字一次类推。结果如下图: 图片.png

  • 2.2 按照桶的顺序依次取出数据,放入到原数组。结果如下: 图片.png

  1. 第二轮排序
  • 3.1.取出每个数的十位数,依次放到桶里,结果如下: 图片.png
  • 3.2 按照桶的顺序依次取出数据,放入到原数组。结果如下:

图片.png

  1. 第三轮排序
  • 4.1.取出每个数的百位数,依次放到桶里,结果如下: 图片.png

  • 4.2 按照桶的顺序依次取出数据,放入到原数组。结果如下: 图片.png

此时数组已经排好序了。

算法代码

function radixSort(arr) {
  // 定义10个桶,是一个二维数组
  let bucketArr = Array(10).fill().map(() => [])
  // 每个桶已放入的数据个数
  let bucketItemCounts = Array(10).fill(0)
  // 取出最大值
  let max = arr[0]
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] > max) {
      max = arr[i]
    }
  }
  // 最大值的位数
  let digitCount = `${max}`.length
  for (let i = 0, n = 1; i < digitCount; i++, n *= 10) {
    for (let j = 0; j < arr.length; j++) {
      let digitOfItem = ~~(arr[j] / n % 10)
      bucketArr[digitOfItem][bucketItemCounts[digitOfItem]] = arr[j]
      // 桶里的数据个数+1
      bucketItemCounts[digitOfItem]++
    }
    // 遍历桶里面的数据
    let index = 0
    for(let bucketItems of bucketArr) {
      for (let item of bucketItems) {
        arr[index++] = item
      }
    }
    // 需要重置
    bucketArr = Array(10).fill().map(() => [])
    bucketItemCounts = Array(10).fill(0)
  }
}