计数排序(Counting Sort)
计数排序(Count Sort)是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的时间复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法,而空间复杂度为O(k)。当然这是一种牺牲空间换取时间的做法,而且当 O(k)>O(nlogn) 的时候其效率反而不如基于比较的排序,因为基于比较的排序的时间复杂度在理论上的下限是 O(nlogn)。
计数排序对数据的限制:要求必须是有数据范围的非负整数,因为要借助数组下标,而且当范围过大的时候,消耗的空间也会变多
算法的具体操作:
(1)找出待排序的数组中的数据范围,建立额外的辅助空间
(2)遍历统计待排序数组,将大小为i的元素放到下标为i的位置
(3)对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
(4)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
代码:
func countingSort(arr []int, maxValue int) []int {
bucketLen := maxValue + 1
bucket := make([]int, bucketLen) // 初始为0的数组
sortedIndex := 0
length := len(arr)
for i := 0; i < length; i++ {
bucket[arr[i]] ++
}
for j := 0; j < bucketLen; j++ {
for bucket[j] > 0 {
arr[sortedIndex] = j
sortedIndex ++
bucket[j] --
}
}
return arr
}

浙公网安备 33010602011771号