计数排序(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
}
posted @ 2022-06-13 15:27  Akisumu  阅读(99)  评论(0)    收藏  举报