golang实现桶排序
Go语言精选
共 1797字,需浏览 4分钟
· 2020-09-14
计数排序的优化版本,用有限数量的桶存放数据(存放规则由自定义函数来确定),对每个桶进行排序。
每个桶中的数包含在一个范围,桶排序是对数据进行了区域划分,然后对每个区域内的数据进行排序,然后依次输出。
初始状态下,整个序列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 main
import "fmt"
//实现排序排序
func quickSort(nums []int, start, end int) []int {
if start < end {
i, j := start, end
key := 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 := 0
for 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++ { //去掉一开始的tmp
nums[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爱好者值得关注
评论
一站式解决方案:基于 Arthas 实现服务发现和权限控制
来源:juejin.cn/post/7281849496983994383👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
0
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
使用 GitHub Actions 构建 Golang PGO
今年 2 月,我宣布 Dolt 版本现已构建为配置文件引导优化 (pgo) 二进制文件,利用 Golang 1.20 的强大功能将 Dolt 的读取性能提高 5.3%。在我宣布这一消息之前,我们的一位常驻 Golang 专家 Zach 试验并测试了 Golang 的 pgo 功能
GoCN
0
SpringBoot+Minio实现上传凭证、分片上传、秒传和断点续传
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。Spring Boot整合Minio后,前端的文件上传有两种方式:1、文件上传到后端,由后端保存到Minio这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、
Java架构师社区
0
超越原生,散点图实现华夫饼图
之前我们介绍过了如何使用新卡片图实现华夫饼图。参考:超越原生,PowerBI 华夫饼图实现但是利用卡片图实现的华夫饼图有一些缺点,形状之间的大小跟间距不太好把握,而且有时形状大一点的话显示就会不正常,需要做出二次调整。今天给大家介绍一种原生视觉对象生成华夫饼图的更佳方案,既简单又美观。上图是利用散点
PowerBI战友联盟
2
Spring Boot + flowable 快速实现工作流
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。来源:blog.csdn.net/zhan107876/article/details/120815560总览一、flowable-ui部署运行二、绘制流程图绘图细节:
Java架构师社区
0
实现订单30分钟自动取消的策略
原文:juejin.cn/post/7285167401821798400简介在电商和其他涉及到在线支付的应用中,通常需要实现一个功能:如果用户在生成订单后的一定时间内未完成支付,系统将自动取消该订单。本文将详细介绍基于Spring Boot框架实现订单30分钟内未支付自动取消的几种方案,并提供实例
JAVA乐园
0
AI大模型之路 第三篇:从零实现词嵌入模型,加深理解!
你好,我是郭震今天我们研究「AI大模型第三篇」:词维度预测,很多读者听过词嵌入,这篇文章解答下面问题:词嵌入是什么意思?怎么做到的?原理是什么?从零实现一个专属你数据集的词嵌入我们完整从零走一遍,根基的东西要理解透,这样才能发明出更好的东西。1 skip-gram模型Skip-gram模型是一种广泛
Python与算法社区
11