算法思路:
1. 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。
2. 从最低位开始,依次入桶进行一次排序
3. 依次从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
平均时间复杂度:O(d(n+r)) r为基数,d为位数
最佳时间复杂度:O(d(n+r))
最差时间复杂度:O(d(n+r))
空间复杂度:O(n+r)
稳定性:稳定
适合场景:待排序序列是在一定范围内的整数。
代码实现:
package main
import (
"fmt"
"math"
)
func main() {
arr := []int{3, 17, 746, 5, 24, 569, 6, 4, 2246, 10}
radixSort(arr, 0, len(arr)-1, maxBits(arr))
for _, v := range arr {
fmt.Println(v)
}
}
func radixSort(arr []int, left, right, bits int) {
// RADIX: 进制位数
RADIX := 10
i, j := 0, 0
// bucket:桶数组,存放每次基数排序后的元素:
bucket := make([]int, right-left+1)
for k := 1; k <= bits; k++ {
// 计数数组:记录每个元素的 第k位 出现的次数:
cnt := make([]int, RADIX)
for i = left; i <= right; i++ {
j = getBits(arr[i], k)
cnt[j]++
}
for i := 1; i < RADIX; i++ {
cnt[i] += cnt[i-1]
}
for i := right; i >= left; i-- {
j = getBits(arr[i], k)
bucket[cnt[j]-1] = arr[i]
cnt[j]--
}
// bucket数组 元素放回 arr数组
i, j = left, 0
for i <= right {
arr[i] = bucket[j]
i++
j++
}
}
}
// maxBits函数:获得数组元素的最大位数:
func maxBits(arr []int) int {
bits, maxNum := 0, math.MinInt64
for _, v := range arr {
bits = max(maxNum, v)
}
for maxNum != 0 {
maxNum /= 10
bits++
}
return bits
}
// getBits函数:获得num数字的第k位数字(自右往左第k位):
func getBits(num, k int) int {
return (num / (int(math.Pow(10, float64(k-1)))) % 10)
}
func max(a, b int) int {
if a > b {
return a
}
return b
}