golang实现桶排序
- 计数排序的优化版本,用有限数量的桶存放数据(存放规则由自定义函数来确定),对每个桶进行排序。 
- 每个桶中的数包含在一个范围,桶排序是对数据进行了区域划分,然后对每个区域内的数据进行排序,然后依次输出。 
- 初始状态下,整个序列R[1,2,……,n]处于无序状态,且大小在[a,a+k]范围内 
- 设置桶的数量为bucketNum,则数据可以划分为[0,bucketNum]、[bucketNum,2*bucketNum-1]、……、[n*(bucketNum-1)/bucketNum,n],数组中数据分别分配到相应桶中 
- 再对每个非空桶中的元素进行排序 
- 所有的非空桶依次合并即得到排序好的数据 
- 1. 时间复杂度:遍历序列O(n),因此桶排序耗时主要取决于每个桶排序用时O(k),总共耗时O(n+k) 
- 2. 稳定性:桶排序是稳定的,相同数的顺序没有改变。 
下面是实现代码,大家有兴趣简单浏览一下
package mainimport "fmt"//实现排序排序func quickSort(nums []int, start, end int) []int {if start < end {i, j := start, endkey := nums[(start+end)/2]for i <= j {for nums[i] < key {i++}for nums[j] > key {j--}if i <= j {nums[i], nums[j] = nums[j], nums[i]i++j--}}if start < j {nums = quickSort(nums, start, j)}if end > i {nums = quickSort(nums, i, end)}}return nums}func bucketSort(nums []int, bucketNum int) []int {bucket := [][]int{}for i := 0; i < bucketNum; i++ {tmp := make([]int, 1)bucket = append(bucket, tmp)}//将数据分配到桶中for i := 0; i < len(nums); i++ {bucket[nums[i]/bucketNum] = append(bucket[nums[i]/bucketNum], nums[i])}//循环所有的桶进行排序index := 0for i := 0; i < bucketNum; i++ {if len(bucket[i]) > 1 {//对每个桶内部进行排序,使用快排bucket[i] = quickSort(bucket[i], 0, len(bucket[i])-1)for j := 1; j < len(bucket[i]); j++ { //去掉一开始的tmpnums[index] = bucket[i][j]index++}}}return nums}func main() {nums := []int{45, 63, 3, 1, 29, 77, 20, 4, 30}fmt.Println("排序前:")fmt.Println(nums)nums = bucketSort(nums, 20)fmt.Println("排序后:")fmt.Println(nums)}
排序前:[]排序后:[]
推荐阅读
站长 polarisxu
自己的原创文章
不限于 Go 技术
职场和创业经验
Go语言中文网
每天为你
分享 Go 知识
Go爱好者值得关注
评论
