基数排序/Go实现

 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 }

 

posted @ 2013-11-03 13:09  Sunlnx  阅读(649)  评论(0编辑  收藏  举报