基数排序简单了解

基数排序是根据数字每一位从低到高去进行分类排序的

比如对于数组[1, 11, 2, 12],从个位数开始,1和11分到了桶1,2和12分到了桶二,接着十位数,1和2分到了一桶,但由于在上一次分桶中,2在1之后,所以这个顺序仍然会保留,11和12也是一样,因此最后得到正确的有序数组[1, 2, 11, 12]

func digit(num, exp int) int {
	return (num / exp) % 10
}

func countingSortDigit(nums []int, exp int) {
	counter := make([]int, 10)
	n := len(nums)

	// 统计0~9数字出现次数
	for i := 0; i < n; i++ {
		d := digit(nums[i], exp)
		counter[d]++
	}

	// 计算出现次数的前缀和,以方便计算后面元素所放置位置
	for i := 1; i < 10; i++ {
		counter[i] += counter[i-1]
	}

	// 根据数字找到所在的桶
	res := make([]int, n)
	for i := n - 1; i >= 0; i-- {
		d := digit(nums[i], exp)
		j := counter[d] - 1
		res[j] = nums[i]
    // 减去前缀和,保证该位同数字不落入同一个位置
		counter[d]--
	}
	for i := 0; i < n; i++ {
		nums[i] = res[i]
	}
}

func radixSort(nums []int) {
	// 找到数组中最大的数
	x := math.MinInt
	for _, num := range nums {
		if num > x {
			x = num
		}
	}

  // 从低到高位进行排序
	for exp := 1; exp <= x; exp *= 10 {
		countingSortDigit(nums, exp)
	}
}

Ref

  1. https://www.hello-algo.com/chapter_sorting/radix_sort
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值