计数排序

核心思想

    1: 是桶排序的特殊情况, 桶的大小为1, 省掉了桶内排序的过程

    2: 不存在交换和比较过程, 是以元素本身的值决定的

适用场景

    1: 数据的范围小

    2: 计数排序只能给非负整数排序, 其他类型数据可尝试转化成[0,~] 

    3: 灵活度高, 可以实现成去重版,非稳定版,稳定版,根据自己的业务场景可自由切换

具体实现

package Sorting

import (

"Algorithms/utils"

)

//计数排序: 桶排序的特殊情况,每个桶内只有一个元素,所以省掉了桶内排序的步骤

//算法流程:1:以算法的最大值为桶的大小 2:以桶的下标为具体数值, 入桶  3:为了保证稳定性,需要额外操作

//可以用来去重

func countingSort(data []int) {

max := utils.GetMaxVal(data) +1

  counts := make([]int, max)

for _,val :=range data {

counts[val]++

}

//稳定版

  sum :=0

  for index, num :=range counts {

sum = sum + num

counts[index] = sum

}

r := make([]int, len(data))

for i := len(data) -1; i >=0; i-- {

r[counts[data[i]] -1] = data[i]

counts[data[i]]--

}

copy(data, r)

//不去重版本

/*for index, val := range counts {

for val > 0 {

fmt.Printf("%v ",index)

val--

}

}

fmt.Println()*/

//去重输出版本

/*for index, val := range counts {

if val > 0 {

fmt.Printf("%v ",index)

}

}

fmt.Println()*/

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容