Go语言数据结构和算法(二十四)基数排序算法

基数排序是一种排序算法.它通过对相同位置的各个元素进行分组来对元素进行排序.然后根据元素的递增或递减顺序对元素进行排序.

1.使用场景:

大型数据集:

基数排序算法对于大型数据集非常有效.因为其他算法的开销对性能影响很大.

稳定排序:

基数排序算法是一种稳定的排序算法.

有限范围数据集:

基数排序算法非常适合取值范围有限的数据集.

2.实现:

2.1方法:

css 复制代码
package itboStudy

// 基数排序.
func RadixSort(array []int) []int {
	largestNum := findLargesNum(array)
	size := len(array)
	signficantDigit := 1
	semiSorted := make([]int, size, size)
	//循环直到达到最大有效数字.
	for largestNum/signficantDigit > 0 {
		//整数是十进制数.
		bucket := [10]int{0}
		//计算进入每个桶的数量.
		for i := 0; i < size; i++ {
			bucket[(array[i]/signficantDigit)%10]++
		}
		//添加前一个桶的计数.
		for i := 1; i < 10; i++ {
			bucket[i] += bucket[i-1]
		}
		//使用桶填充一个名为semiSorted数组.
		for i := size - 1; i >= 0; i-- {
			bucket[(array[i]/signficantDigit)%10]--
			semiSorted[bucket[(array[i]/signficantDigit)%10]] = array[i]
		}

		for i := 0; i < size; i++ {
			array[i] = semiSorted[i]
		}
		signficantDigit *= 10
	}
	return array
}

// 查找数组中最大的数.
func findLargesNum(array []int) int {
	laegeNum := 0
	for i := 0; i < len(array); i++ {
		if array[i] > laegeNum {
			laegeNum = array[i]
		}
	}
	return laegeNum
}

2.2main方法:

css 复制代码
func main() {
	array := []int{33, 23, 56, 7, 8, 18, 99, 28}
	radixSort := itboStudy.RadixSort(array)
	fmt.Println(radixSort)
}

3.实战:

返回一个数组中两个连续元素之间的最大差值.

3.1方法:

// 复制代码
func findLargesNum(array []int) int {
	laegeNum := 0
	for i := 0; i < len(array); i++ {
		if array[i] > laegeNum {
			laegeNum = array[i]
		}
	}
	return laegeNum
}

// 基数排序.
func radixSortFunc(array []int) []int {
	largest := findLargesNum(array)
	size := len(array)
	signficantDigit := 1
	semiSorted := make([]int, size, size)
	for largest/signficantDigit > 0 {
		bucket := [10]int{0}
		for i := 0; i < size; i++ {
			bucket[(array[i]/signficantDigit)%10]++
		}
		for i := 1; i < 10; i++ {
			bucket[i] += bucket[i-1]
		}
		for i := size - 1; i >= 0; i-- {
			bucket[(array[i]/signficantDigit)%10]--
			semiSorted[bucket[(array[i]/signficantDigit)%10]] = array[i]
		}
		for i := 0; i < size; i++ {
			array[i] = semiSorted[i]
		}
		signficantDigit *= 10
	}
	return array
}

func MaxDifference(array []int) int {
	if len(array) < 2 {
		return 0
	}
	radixSortFunc(array)
	ret := 0
	for i := 1; i < len(array); i++ {
		if tmp := array[i] - array[i-1]; tmp > ret {
			ret = tmp
		}
	}
	return ret
}

3.2main方法:

css 复制代码
func main() {
	array := []int{1, 6, 8, 16}
	difference := itboStudy.MaxDifference(array)
	fmt.Println(difference)
}

不是万事都要撞南墙.可以撞北墙东墙西墙.





如果大家喜欢我的分享的话.可以关注我的微信公众号

念何架构之路

相关推荐
小马爱打代码5 小时前
SpringBoot:封装 starter
java·spring boot·后端
STARSpace88885 小时前
SpringBoot 整合个推推送
java·spring boot·后端·消息推送·个推
Marktowin6 小时前
玩转 ZooKeeper
后端
蓝眸少年CY6 小时前
(第十二篇)spring cloud之Stream消息驱动
后端·spring·spring cloud
码界奇点7 小时前
基于SpringBoot+Vue的前后端分离外卖点单系统设计与实现
vue.js·spring boot·后端·spring·毕业设计·源代码管理
lindd9119117 小时前
4G模块应用,内网穿透,前端网页的制作第七讲(智能头盔数据上传至网页端)
前端·后端·零基础·rt-thread·实时操作系统·项目复刻
Loo国昌8 小时前
【LangChain1.0】第八阶段:文档处理工程(LangChain篇)
人工智能·后端·算法·语言模型·架构·langchain
vx_bisheyuange8 小时前
基于SpringBoot的海鲜市场系统
java·spring boot·后端·毕业设计
李慕婉学姐8 小时前
【开题答辩过程】以《基于Spring Boot和大数据的医院挂号系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
大数据·spring boot·后端
源代码•宸9 小时前
Leetcode—3. 无重复字符的最长子串【中等】
经验分享·后端·算法·leetcode·面试·golang·string