美文网首页暮潇潇诗文
基数排序(Go语言版本)

基数排序(Go语言版本)

作者: 码二哥 | 来源:发表于2020-03-08 15:38 被阅读0次

    1、基数 排序 关键

    1、基数排序中,桶的数量应该是定死的,10个桶,每个桶能存储的值也是设置好了的。

    • 桶号,是0到9,对应的是数组的下标,或者说map里key的值

    • 每个桶存储的值的范围是

      • 每个桶只能存储一个数字,对应的就是桶号,如0号桶,只能存储0

      • 但是个数是没有限制的

    2、先将数据按照个位数从小到进行排序;

    • 个位数的数字就是对应桶号,将数值映射到对应的桶里,这样的话,待测试数据就从个位上小到大排序好了,

    • 然后将非空桶里的数据重新回写到原数据里

    3、再按照十位数进行从小到大排序

    • 十位数的数字就是对应的桶号(如果该数值没有十位的话,就默认为0),将数值映射到对应的桶里,这样的话,待测试数据就从十位上小到大排序好了,

    • 然后将非空桶里的数据重新回写到原数据里

    4、依次递归2,3步,直到所有的位数全部 排序完了

    2、源码

    package fangshi2
    
    import (
        "math"
        "fmt"
        "strconv"
    )
    
    func RadixSort(data []int) {
    
        ml := maxLength(data)
    
        data2Bucket(data, 1, ml)
    }
    
    func newBucket() map[int][]int {
        var b = make(map[int][]int)
    
        for i := 0; i < 10; i++ {
            b[i] = []int{}
        }
    
        return b
    }
    
    func maxLength(data []int) int {
        var ml int
        for _, v := range data {
            t := (int)(math.Log10(float64(v))) + 1
            if ml < t {
                ml = t
            }
        }
    
        return ml
    }
    
    func data2Bucket(data []int, i, ml int) {
        if i > ml {
            return
        }
    
        sortForBucket(data, i)
    
        data2Bucket(data, i+1, ml)
    }
    
    func sortForBucket(data []int, i int) {
        b := newBucket()
    
        for _, v := range data {
            vs := strconv.Itoa(v)
            l := len(vs)
    
            if i <= l {
                vd := fmt.Sprintf("%c", vs[l-i])
                k, e := strconv.Atoi(vd)
                if e == nil {
                    b[k] = append(b[k], v)
                }
    
            } else {
                b[0] = append(b[0], v)
            }
        }
    
        var index int
        for j:=0; j<10; j++{
            v := b[j]
            if len(v) != 0 {
                for i := 0; i < len(v); i++ {
                    data[index] = v[I]
                    index++
                }
            }
        }
    }
    
    
    将测试数据映射到桶里,再回写到原数据里

    3、测试

    
    package fangshi2
    
    import (
        "testing"
        "fmt"
    )
    
    
    func TestRadixSort(b *testing.T) {
        datas := []int{
            9,8,7,4,5,4,3,3,1,22,23,222,28,77,78,57,25,33,39,34,44,89,22,12,132,321,461,31,30,55,54,66,88,77,66,89,59,69,68,67,63,61,62,67,77,71,72,79,73,77,88,73,11,13,18,12,19,88,78,89,83,84,81,99,92,93,94,98,96,
        }
    
        //datas := []int{
        //  2,3,4,1,6,8,2,11,32,45,31,
        //}
    
    
        RadixSort(datas)
    
        for _, d := range datas{
            fmt.Printf("%d ", d)
        }
        fmt.Println()
    }
    
    
    基数排序测试

      
      
      
      

    打赏

    相关文章

      网友评论

        本文标题:基数排序(Go语言版本)

        本文链接:https://www.haomeiwen.com/subject/panddhtx.html