基数排序-LSD-golang
这是我目前在全网找到在golang语言中,最好,思路最清晰的 基数排序实现代码,
基数排序不同于之前所介绍的各类排序,前边介绍到的排序方法或多或少的是通过使用比较和移动记录来实现排序,而基数排序的实现不需要进行对关键字的比较,只需要对关键字进行“分配”与“收集”两种操作即可完成。
例如对无序表{50,123,543,187,49,30,0,2,11,100}
进行基数排序,由于每个关键字都是整数数值,且其中的最大值由个位、十位和百位构成,每个数位上的数字从 0 到 9,首先将各个关键字按照其个位数字的不同进行分配分配表如下所示:
通过按照各关键字的个位数进行分配,按照顺序收集得到的序列变为:{50,30,0,100,11,2,123,543,187,49}
。在该序列表的基础上,再按照各关键字的十位对各关键字进行分配,得到的分配表如下图所示:
由上表顺序收集得到的记录表为:{0、100、2、11、123、30、543、49、50、187}
。在该无序表的基础上,依次将表中的记录按照其关键字的百位进行分配,得到的分配如下图所示:
最终通过三次分配与收集,最终得到的就是一个排好序的有序表:{0、2、11、30、49、50、100、123、187、543}
。
例子中是按照个位-十位-百位的顺序进行基数排序,此种方式是从最低位开始排序,所以被称为最低位优先法(简称“LSD法”)。
害~这么好的代码, 当然我自己写的的啦, 直接上代码:
package sortimport ("fmt""math""strconv"
)/**
基数排序不同于之前所介绍的各类排序,前边介绍到的排序方法或多或少的是通过使用比较和移动记录来实现排序,
而基数排序的实现不需要进行对关键字的比较,只需要对关键字进行“分配”与“收集”两种操作即可完成。基数排序-LSD思想:1. 从所有数据中取出最大值2. 将所有数据按个个位数到n位数(取决于最大值有),分组,3. 收集第2步分组之后的数据,可以得到一个新的数据4.重复2和3,直到分配了最大数的n位数(个位,十位,百位,千位。。。)
*/// 获取最大数
func getMaxNum(arr []int) int {if len(arr) == 0 {panic("空数组")}var max = arr[0]if len(arr) == 1 {return max}for i := 1; i < len(arr); i++ {if max < arr[i] {max = arr[i]}}return max
}/**
int n = 123456;
int unitPlace = n / 1 % 10; 个位
int tenPlace = n / 10 % 10; 十位
int hundredPlace = n / 100 % 10; 百位
int thousandPlace = n / 1000 % 10; 千位
*/
// @params num int 数字
// @params loc int 需要获取从后边开始的第几位
func digit(num int, loc int) int {return num / int(math.Pow10(loc-1)) % 10
}// RadixSort 排序
func RadixSort(arr []int) []int {// 1.获取最大值maxNum := getMaxNum(arr)// 进行个位数分配 只用一个桶就可以了var bucked = map[int][]int{}// 将元素放进去maxNumLen := len(strconv.Itoa(maxNum))startRightLoc := 1// 最大数有几位,就进行几轮分配for startRightLoc <= maxNumLen {for i := 0; i < len(arr); i++ {// 获取位数digitLoc := digit(arr[i], startRightLoc)bucked[digitLoc] = append(bucked[digitLoc], arr[i])}// 第几轮结束,依次取数数据arr = []int{}for i := 0; i <= 9; i++ {arr = append(arr, bucked[i]...)}bucked = map[int][]int{}fmt.Printf("第%d轮的数为%v\n", startRightLoc, arr)startRightLoc++}return arr
}
基数排序-LSD-golang相关推荐
- 基数排序——多关键字排序(MSD/LSD)以及链式基数排序
排序 9.6 基数排序 9.6.1 多关键字排序 9.6.2 链式基数排序 9.6 基数排序 基数排序又被称为桶排序.与前面介绍的几种排序方法相比较,基数排序和它们有明显的不同.前面所介绍的排序方法都 ...
- 十大算法,描述+代码+演示+分析+改进(赶紧收藏!)
十大算法 1.冒泡排序 (1)算法描述 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要 ...
- 排序算法汇总——转载自http://blog.csdn.net/zhanglong_daniel/article/details/52513058
1. 冒泡排序 1.1 算法原理: S1:从待排序序列的起始位置开始,从前往后依次比较各个位置和其后一位置的大小并执行S2. S2:如果当前位置的值大于其后一位置的值,就把他俩的值交换(完成一次全序列 ...
- 排序算法--排序算法汇总
排序算法无疑是学习数据结构中的重点内容,本文将给出排序算法的汇总. 下面是具体的实现: #include<stdio.h> #include<stdlib.h> #includ ...
- 各种排序算法及其实现总结
排序算法总结 1.插入排序 一般来说,插入排序 都采用in-place在数组上实现.具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 ...
- 排序算法时间复杂度、空间复杂度、稳定性比较
排序算法分类 排序算法比较表格填空 排序算法 平均时间复杂度 最坏时间复杂度 空间复杂度 是否稳定 冒泡排序 :-----: :-–: :-–: :-–: 选择排序 :-----: :-–: :-–: ...
- 各种排序(数据结构复习之内部排序算法总结)
1.三种选择排序(简单选择排序,树形选择排序,堆排序) #include<iostream> #include<cstring> #include<string> ...
- 排序算法 -- 待增加
文章目录 排序算法 堆排序 图解 解决方案 归并排序 图解 解决方案 快速排序 图解 代码 排序总结 总结表 基数排序 代码 数据结构----排序 排序算法 堆排序 堆.优先队列的实现 图解 解决方案 ...
- 数据结构----排序
##数据结构--排序 Created with Raphaël 2.1.2选择选择直接选择直接选择堆排序堆排序直接选择堆排序大根堆.小根堆:找出最小(大)的Key Created with Rapha ...
- prim算法_历时两月,终拿字节跳动offer,算法面试题分享「带答案」
欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...
最新文章
- 每日一皮:每天到公司 VS 工作一小时后
- 资本寒冬,这十大创业公司值得尊重(上)
- 机器学习基础-特征缩放交叉验证法-05
- 苹果手机透明桌面_原来苹果手机辨别真假这么简单!查看桌面1个图标,就能轻松分辨...
- mysql gtid深入_深入理解MySQL 5.7 GTID系列(四):mysql.gtid_executedPREVIOUS GTID EVENT
- c语言switch scanf语句,c语言switch语句 谢谢·!~!~
- Bootstrap下拉菜单中禁用某个下拉菜单
- MongoDB(Golang)常用复合查询
- C#socket编程序(二)
- 项目开发版本控制----Git
- hybrid app支持html5,Hybrid App 接入
- linux 添加pv失败,linux上创建PV/VG/LV
- c属于什么语言,C语言属于什么语言
- 移动应用测试场景的五个重点
- (Fabric 学习三)Fabric2.2 多机部署 使用fabcar链码
- 适当处理错误(捕获异常)
- 链表_第10章_基本数据结构_算法导论
- 骑行318、 2016.7.16
- 高通 Android 12默认授予文件夹权限
- [sampling] MixGCF: An Improved Training Method for Graph Neural Network-based Recommender Systems