首页 > 编程语言 >【算法-计数排序和桶排序】Go语言实现

【算法-计数排序和桶排序】Go语言实现

时间:2023-01-22 20:56:44浏览次数:39  
标签:count arr int fmt value 计数 Go 排序

计数排序

  1. 新创建一个计数数组,size=Max
  2. 遍历数组, 值是索引。
  3. 遍历计数数组,依次排列。
func CountSort(arr []int) {

	count_arr := make([]int, 10)
	for _, value := range arr {
		count_arr[value]++
	}
	i := 0
	for index, value := range count_arr {
		for value > 0 {
			arr[i] = index
			i++
			value--
		}
	}
}

基数排序(桶排序)

image

import (
	"fmt"
	"math"
)

func RadixSort(arr []int) {

	// //初始化10个桶, 0-9 //在这里初始化错了。要么就for循环重置桶。
	// bucket := make([][]int, 10) //如果是其他进制数 ,就以其它进制数的个数来初始化。
	// fmt.Println(bucket)

	// 最高位
	max_bit := 3 // 可以先遍历一遍数组,得到最大值,然后计算其位数。这里就以三位数来。

	// 最外层循环,从个位 1到最高位 百位 3

	for d := 1; d <= max_bit; d++ {
		//初始化10个桶, 0-9
		bucket := make([][]int, 10) //如果是其他进制数 ,就以其它进制数的个数来初始化。
		fmt.Println(bucket)

		//遍历当前位的数,然后放进自己的桶中,入桶
		for _, value := range arr {
			mi := math.Pow(10, float64(d-1))
			// fmt.Println(mi)
			current_d := value / int(mi) % 10
			fmt.Println(d, value, current_d)
			bucket[current_d] = append(bucket[current_d], value)

		}
		fmt.Println(d, "入桶", bucket)
		// 出桶
		c := 0
		for i := 0; i < len(bucket); i++ {
			for j := 0; j < len(bucket[i]); j++ {
				arr[c] = bucket[i][j]
				c++
			}
		}
		fmt.Println(d, "出桶", arr)
	}
}

错误点:桶初始化的位置不对,每次for循环要重新初始化。

基数排序优化

就是使用词频统计,当前位前面有多少个数,从右到左还原数组。

package basicsort

import (
	"fmt"
	"math"
)

func RadixSort02(arr []int) {

	// 最高位
	max_bit := 3 // 可以先遍历一遍数组,得到最大值,然后计算其位数。这里就以三位数来。

	// 最外层循环,从个位 1到最高位 百位 3

	for d := 1; d <= max_bit; d++ {
		// 当前位 数字 词频统计
		count := [10]int{}

		// help数组,和当前数组一致
		help := make([]int, len(arr)) //这里得用make, 不能用 []int{}.会报index out of range

		//遍历当前位的数,然后放进自己的桶中,入桶
		for _, value := range arr {
			mi := math.Pow(10, float64(d-1))
			// fmt.Println(mi)
			current_d := value / int(mi) % 10
			fmt.Println(d, value, current_d)
			count[current_d]++
		}
		fmt.Println(d, "count", count)

		// 计算 当前 i位置前面有多少个说

		for i := 1; i < len(count); i++ {
			count[i] = count[i] + count[i-1]
		}
		fmt.Print("前面有多少个", count)

		//从右到左遍历
		for i := len(arr) - 1; i >= 0; i-- {
			value := arr[i]
			mi := math.Pow(10, float64(d-1))
			current_d := value / int(mi) % 10

			tmp_index := count[current_d]
			count[current_d]--
			help[tmp_index-1] = value //这里要减一, 比如前面有7个,索引是6
		}
		fmt.Print("help:", help)
		copy(arr, help)
		fmt.Print("arr:", arr)
	}
}

总结

这种不使用比较大小来排序的方式对数据有要求。必须是进制数。不能是其他对象。
计数排序,数的范围太大,开辟的内存就大,不好。

标签:count,arr,int,fmt,value,计数,Go,排序
From: https://www.cnblogs.com/clllll/p/17064654.html

相关文章

  • 离散化( 排序+ 二分查找)
     inttemp[N],a[N];intmain(){intn;cin>>n;for(inti=1;i<=n;i++){cin>>a[i];temp[i]=a[i];}sort(temp+1,temp+n+1);......
  • (18)go-micro微服务ELK介绍
    目录一什么是ELK二Beats的六种工具三ELK系统的特点四ELK+beats系统架构五ELK优点六最后一什么是ELKELK是三个[开源软件]的缩写,分别表示:Elasticsearch,Logstash,......
  • Three.js 进阶之旅:新春特典-Rabbit craft go
    声明:本文涉及图文和模型素材仅用于个人学习、研究和欣赏,请勿二次修改、非法传播、转载、出版、商用、及进行其他获利行为。摘要兔年到了,祝大家身体健,康万事顺利。本文内......
  • 17种编程语言实现排序算法-希尔排序
    开源地址https://gitee.com/lblbc/simple-works/tree/master/sort/覆盖语言:C、C++、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。......
  • 17种编程语言实现排序算法-选择排序
    开源地址https://gitee.com/lblbc/simple-works/tree/master/sort/覆盖语言:C、C++、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。......
  • MySQL排序与分页详解
    1.排序数据排序规则使用ORDERBY子句排序ASC(ascend):升序DESC(descend):降序ORDERBY子句在SELECT语句的结尾。单列排序SELECTlast_name,job_id,department_id,hire_d......
  • go md5加密
    本文讲解如何使用go封装好的md5算法,不深入剖析md5算法原理。首先我们要知道md5算法属于hash算法的一种,所以在了解md5之前,我们先认识一下go提供的hash接口。hash算法是保证......
  • 【算法-堆排序】Go语言实现
    堆排序通过数组构造堆,根节点是最大的元素是大根堆,相反为小根堆主要有俩个方法,插入InsertHeap,调整堆:heapify对于排序来说:先把数组构造成一个大根堆,然后[0]依次......
  • 11 break、continue、goto
    #break、continue、gotopackagecom.zhan.base_2;publicclassTest11{publicstaticvoidmain(String[]args){//continue语句:跳出本次循环,直......
  • 归并排序和快速排序补充扩展-Go语言
    基于堆排序的算法题小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。就是在合并的时候,当左边数组的数小于右边数组的......