入口函数
func RadixSort(arr *[]int) {
radixSort(arr, 0, len(*arr)-1, maxBits(arr))
}
首先,得到最大的数的位数(100为3位数),方便在其他低于3位数的数前补上0。
func maxBits(arr *[]int) int {
max := math.MinInt64
for i := 0; i < len(*arr); i++ {
if (*arr)[i] > max {
max = (*arr)[i]
}
}
res := 0
for max != 0 {
res++
max /= 10
}
return res
}
若是3位,则进行三次循环,每次先计算好这一轮循环的那一位的数字(0-9)的个数是多少,用count存储,count数组的大小为10,然后从尾到头将数组中的数存在Bucket中对应的位置(count[j]-1),j代表将要存进去的那个数的此轮的这一位的数字,count[j]-1代表此数应在Bucket中的索引位置。最后将Bucket中的数从头到尾赋值给arr数组。这样这一轮的这一位上的数字就从小到大给排序好了。再进行下一轮。
func radixSort(arr *[]int, begin int, end int, digit int) {
radix := 10
bucket := make([]int, end-begin+1)
for d := 1; d <= digit; d++ {
count := make([]int, radix)
for i := begin; i <= end; i++ {
j := getDigit((*arr)[i], d)
count[j]++
}
for i := 1; i < radix; i++ {
count[i] = count[i] + count[i-1]
}
for i := end; i >= begin; i-- {
j := getDigit((*arr)[i], d)
bucket[count[j]-1] = (*arr)[i]
count[j]--
}
j := 0
for i := begin; i <= end; i++ {
(*arr)[i] = bucket[j]
j++
}
}
}
func getDigit(x, d int) int {
return ((x / pow(d)) % 10)
}
func pow(d int) int {
if d == 1 {
return 1
}
flag := 1
for i := 0; i < d-1; i++ {
flag *= 10
}
return flag
}