基数排序(radixSort)

算法思路
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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值