1 package main
2 import (
3 "fmt"
4 )
5
6 type Radix struct {
7 length int //序列中最大数的位数
8 radix [][]int //0-9的10个桶
9 nums []int //要排序的序列
10 }
11 //初始化排序的相关参数
12 func (r *Radix ) Init(numbers []int) {
13 r.nums = numbers
14 r.getLen()
15 }
16 //获取序列最大数的位数
17 func (r *Radix) getLen() {
18 size := len(r.nums)
19 max := r.nums[0]
20 for i := 1; i < size; i++ {
21 if r.nums[i] > max {
22 max = r.nums[i]
23 }
24 }
25 r.length = 1
26 max = max / 10
27 for max > 0 {
28 r.length++
29 max = max / 10
30 }
31 }
32 //输出序列
33 func (r *Radix) Display() {
34 for _, v := range r.nums {
35 fmt.Printf("%d\t", v)
36 }
37 fmt.Print("\n")
38 }
39 //排序函数
40 func (r *Radix) Sort() {
41 size := len(r.nums)
42 var i, j, k int
43 m := 1
44 for i = 1; i <= r.length; i++ { //循环次数为常数,即序列中最大数的位数
45 r.radix = make([][]int, 10)
46 for j = 0; j < 10; j++ { //初始化0-9各位桶
47 r.radix[j] = make([]int, 0)
48 }
49 for j = 0; j < size; j++ { //遍历要排序的序列,将相应位数的元素加入到对应的位桶中
50 k = r.nums[j] / m % 10
51 r.radix[k] = append(r.radix[k], r.nums[j])
52 }
53 r.nums = make([]int, 0) //清空原序列数组
54 for j = 9; j >= 0; j-- { //将9-0各位桶的数重新组装放到原序列数组当中
55 r.nums = append(r.nums, r.radix[j]...)
56 }
57 m = m * 10
58 r.Display()
59 }
60
61
62 }
63
64
65 func main() {
66 r := new(Radix)
67 r.Init([]int{430, 122, 332, 167, 899, 998, 455, 691, 571})
68 r.Sort()
69 }