计数排序是一种排序算法.它通过计算数组中每个唯一元素的出现次数对数组元素进行排序.计数存储在辅助数组中.排序是通过将计数映射为辅助数组的索引完成的.
1.使用场景:
对大型数组进行排序:
计数排序算法可以线性时间复杂度对大型数据集进行排序.
对有限范围内的数字进行排序:
当整数范围已知且有限时.计数排序算法效果最佳.
稳定排序:
是一种稳定的排序算法.它保持输入数组中相等元素的相对顺序.
2.实现:
2.1方法:
func CountSort(array []int) []int {
count := makeRange(0, findMax(array))
//计数.
for _, value := range array {
count[value] += 1
}
for i := 1; i < len(count); i++ {
//下边是从0开始.统一加一.
count[i] += count[i-1]
}
//复制到正确的位置.往指定索引放入元素.
res := make([]int, len(array))
for i := 0; i < len(array); i++ {
e := array[i]
t := count[e] - 1
res[t] = e
count[e] = count[e] - 1
}
return res
}
func findMax(array []int) int {
var temp int
temp = array[0]
for _, e := range array {
if temp < e {
temp = e
}
}
return temp
}
func makeRange(min, max int) []int {
a := make([]int, max-min+1)
for i := range a {
a[i] = 0
}
return a
}
******2.2main方法:
array := []int{33, 23, 56, 7, 8, 18, 99, 28}
countSort := data.CountSort(array)
fmt.Println(countSort)
}
3.实战:
3.1方法:
bucket := make([]int, 100, 100)
for _, item := range real {
bucket[item-1] += 1
}
//整理排序后的切片.
sort := make([]int, 0, len(real))
for index := range bucket {
flag := bucket[index]
for i := 0; i < flag; i++ {
sort = append(sort, index+1)
}
}
//比较排序好的.和未排序的.
ret := 0
for index := range real {
if sort[index] != real[index] {
ret = ret + 1
}
}
return ret
}
3.2main方法:
array := []int{1, 6, 8, 1, 6, 6}
countSort := data.CheckHeight(array)
fmt.Println(countSort)
}
***用手拨开浮沉.那是万千繁华.
如果大家喜欢我的分享的话.可以关注我的微信公众号
念何架构之路