社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
title: Go数据结构与算法-桶排序
tags: go,算法
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
桶排序的基本思路是将数据根据计算规则来分组,并将数据依次分配到对应分组中。
分配时可能出现某分组里有多个数据,那么再进行分组内排序。
然后得到了有序分组,最后把它们依次取出来放到数组中即实现了整体排序。
桶排序最好情况下使用线性时间O(n),
/*
桶内排序
*/
func sortInBucket(bucket []int) {//此处实现插入排序方式,其实可以用任意其他排序方式
length := len(bucket)
if length == 1 {return}
for i := 1; i < length; i++ {
backup := bucket[i]
j := i -1;
//将选出的被排数比较后插入左边有序区
for j >= 0 && backup < bucket[j] {//注意j >= 0必须在前边,否则会数组越界
bucket[j+1] = bucket[j]//移动有序数组
j -- //反向移动下标
}
bucket[j + 1] = backup //插队插入移动后的空位
}
}
/*
获取数组最大值
*/
func getMaxInArr(arr []int) int{
max := arr[0]
for i := 1; i < len(arr); i++ {
if arr[i] > max{ max = arr[i]}
}
return max
}
/*
桶排序
*/
func Sort(arr []int) []int {
//桶数
num := len(arr)
//k(数组最大值)
max := getMaxInArr(arr)
//二维切片
buckets := make([][]int, num)
//分配入桶
index := 0
for i := 0; i < num; i++ {
index = arr[i] * (num-1) /max//分配桶index = value * (n-1) /k
buckets[index] = append(buckets[index], arr[i])
}
//桶内排序
tmpPos := 0
for i := 0; i < num; i++ {
bucketLen := len(buckets[i])
if bucketLen > 0{
sortInBucket(buckets[i])
copy(arr[tmpPos:], buckets[i])
tmpPos += bucketLen
}
}
return arr
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!