桶排序 Go语言实现经典算法


桶排序原理

桶排序 (Bucket sort)或所谓的箱排序的原理是将数组分到有限数量的桶子里,然后对每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后将各个桶中的数据有序的合并起来。
桶排序原理图

效率

桶排序是常见排序里最快的一种,大部分情况下比快排还要快。
时间复杂度为O(N+K),空间复杂度也为O(N+K)

稳定性

桶排序是稳定排序

桶排序的Go语言实现代码

package main

import (
    "fmt"
    "time"
    "math/rand"
)

func bucketSort(numArr []int,bucketSize int){

    minValue := numArr[0]
    maxValue := numArr[0]

    for i := 0; i<len(numArr); i++ {
        if minValue > numArr[i] {
            minValue = numArr[i]
        }
        if maxValue < numArr[i] {
            maxValue = numArr[i]
        }
    }

    // 桶切片初始化
    bucketCount := make([][]int,(maxValue - minValue) / bucketSize +1)

    // 数据入桶
    for i := 0; i<len(numArr); i++ {
        bucketCount[(numArr[i] - minValue) / bucketSize] = append(bucketCount[(numArr[i] - minValue) / bucketSize] , numArr[i])
    }

    key := 0
    // 对每个桶进行排序,这里使用冒泡排序
    for _ , bucket := range bucketCount {
        if (len(bucket) <= 0) { continue; }
        insertionSort(bucket);
        for _ , value := range bucket {
            numArr[key] = value
            key = key+1
        }
    }
    return
}

func insertionSort(numArr []int){
    for i := 0; i < len(numArr); i++ {
        for j := 0; j < len(numArr)-1; j++ {
            if numArr[j] > numArr[j+1]{
                numArr[j],numArr[j+1] = numArr[j+1],numArr[j]
            }
        }
    }
}

// 桶排序
func main(){
    numArr := make([]int,10)
    rand.Seed(time.Now().UnixNano())

    for i:=0; i<len(numArr); i++ {
        numArr[i]=rand.Intn(100)
    }
    fmt.Println(numArr)
    bucketSort(numArr,10)
    fmt.Println(numArr)
}

本文发表于2019年12月17日 23:32
阅读 816 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

又是一年五一,祝我们工人阶级劳动节快乐! 今年被困在北京了,离境再入境需要隔离十五天。只能京津冀周边走一走了,想出去玩啊啊啊啊啊~

人活一辈子,不是一年两年。时间是有连续性的,做抉择的时候要多看几步。保持警惕,大丈夫有所为,有所不为。

跟人接触,不要想:我能从你身上得到什么,要想:我能给你什么。 想通了,内核就稳了。

这个世界上,别人只会看你现在的样子而不是以后的样子。你以后的样子只有自己才相信。如果没有执行力,一切都是虚妄。

对普通人来说,人和人相处其实最重要的是感觉。感觉不好,你说什么都没用,怎么解释都没用,越说越错,反正最后不好的锅都往你身上扣。所谓“说你行你就行,不行也行。说你不行,你就不行,行也不行”就是这个意思。狼要吃人根本不需要理由,你也同样叫不醒装睡的人。遇到这种情况,早点闪人才是上策。不过大部分人的问题是没有闪人的心态,能力,和资源。

快捷链接
网站地图
提交友链
Copyright © 2016 - 2020 Cion.
All Rights Reserved.
ICP备案:鲁ICP备19012333号-4.

鲁公网安备 37061302000383号.