思想:
-
给出一串需要排序的数组,然后选出里面最大的数字,计算它有几位(个十百千位),然后对数组中其他的数字补零。
-
开辟一个大小为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]