go语言实现计数排序

本文介绍了使用Go语言实现计数排序的方法。首先确定输入数组的最大数并计算其位数,然后创建一个计数数组记录各数位上的数值出现次数。接着从后向前遍历原数组,根据计数数组更新辅助数组,最终得到排序后的结果。示例运行结果显示排序后的数组为[9, 14, 23, 32, 43, 46, 50, 81, 99, 102]。" 107445639,9915292,计算整数各位置数字之和,"['Python', '数值计算']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思想:

  • 给出一串需要排序的数组,然后选出里面最大的数字,计算它有几位(个十百千位),然后对数组中其他的数字补零。

  • 开辟一个大小为10的count数组,用于做记录位数上面0-9的数出现的次数(大于或等于当前下标的个数)

  • 将原数组从后往前遍历,开辟一个辅助数组(help[])来存储新排序的元素,元素应存放在辅助数组中的位置的计算方式为:例如当前元素个位数(十位数)为4,则取count[4]中的数减一,就是当前元素应存放在辅助数组中的 位置,help[count[4]-1] = 当前元素,别忘记了count[4] = count[4]-1哦。

  • 当这一轮过完之后,然后最大数不止于个位数,还有十位数和百位数,那么一次按照个位数的处理方式完成其他位数的排序。

个位数的处理的结果如下图展示:
在这里插入图片描述

package main

import "fmt"

func main() {
	arr := []int{50, 23, 9, 46, 81, 102, 99, 43, 32, 14}
	radixSort(arr, 0, len(arr) - 1, maxBits(arr))

	fmt.Println(arr)
}

func radixSort(arr []int, L, R, digit int){
	radix := 10
	i, j := 0, 0
	//有多少个数准备多少个辅助空间
	bucket := make([]int, R - L + 1)
	for d := 1; d <= digit; d++ { //有多少位就进出多少次
		//count[i] 当前位(d位)是(0~i)的数字有多少个
		count := make([]int, radix)
		//计算当前d位数字的个数
		for i = L; i <= R; i++ {
			j = getDigit(arr[i], d)
			count[j]++
		}
		//计算小于等于当前位的数的其他数有多少个
		for i = 1; i < radix; i++{
			count[i] = count[i] + count[i - 1]
		}
		for i = R; i >= L; i--{
			j = getDigit(arr[i], d)
			bucket[count[j] - 1] = arr[i]
			count[j]--
		}
		j = 0
		for i = L; i <= R; i++{
			arr[i] = bucket[j]
			j++
		}
	}
}

func getDigit(num int, d int) int{
	return (num / pow(10, d - 1))%10
}

func pow(x, y int)int{
	res := 1
	for i := 0; i < y; i++{
		res *= x
	}
	return res
}

func maxBits(arr []int)int{
	res, max := 0, arr[0]
	for i := 0; i < len(arr); i++{
		if max < arr[i]{
			max = arr[i]
		}
	}
	for max != 0{
		res++
		max /= 10
	}
	return res
}

运行结果:[9 14 23 32 43 46 50 81 99 102]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值