📜  排序算法-计数排序(1)

📅  最后修改于: 2023-12-03 15:39:50.038000             🧑  作者: Mango

排序算法-计数排序

计数排序是一种非基于比较的排序算法,可以在线性时间内完成对于一定范围内的整数排序。计数排序的核心思想是对每个输入元素x,确定小于x的元素个数,从而确定x在输出序列中的位置。

算法流程
  1. 找出待排序数组中最大和最小的元素
  2. 统计数组中每个值为i的元素个数,存入辅助数组C的第i项
  3. 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
  4. 反向填充目标数组:将每个元素i放在新数组的第C[i]项,每放一个元素就将C[i]减一
算法分析
时间复杂度

计数排序的时间复杂度为O(n+k),其中n是待排序数组的长度,k是待排序数组中最大元素和最小元素的差值。由于计数排序不是基于比较的排序算法,因此不会受到比较交换操作的影响,所以计数排序的时间复杂度可以达到O(n)。

空间复杂度

计数排序需要额外的辅助数组C来存储每个元素的出现次数,因此计数排序的空间复杂度为O(k)。

稳定性

计数排序是一种稳定的排序算法,因为在排序过程中,相等的元素会被放置在相邻的位置上。

代码实现

以下是使用Python实现计数排序的代码示例:

def counting_sort(array):
    size = len(array)
    if size <= 1:
        return array

    # 找到最大值和最小值
    max_value, min_value = max(array), min(array)

    # 统计each_value出现的次数
    each_count = [0] * (max_value - min_value + 1)
    for i in range(size):
        each_count[array[i] - min_value] += 1

    # 累加each_count,得到每个元素的位置
    for i in range(1, len(each_count)):
        each_count[i] += each_count[i - 1]

    # 倒序遍历原始数组,根据each_count得到排序结果
    result = [0] * size
    for i in range(size - 1, -1, -1):
        position = each_count[array[i] - min_value] - 1
        result[position] = array[i]
        each_count[array[i] - min_value] -= 1

    return result

以上代码首先找到待排序数组中的最大值和最小值,然后使用一个辅助数组each_count来记录每个元素出现的次数。接着,遍历each_count数组并累加,得到每个元素在排序结果中的位置。最后,倒序遍历原始数组,根据each_count得到排序结果。

总结

计数排序是一种快速高效的排序算法,尤其适用于一定范围内的整数排序。和其他排序算法相比,计数排序不需要进行比较和交换操作,因此其时间复杂度可以达到O(n)。但是,计数排序的缺点是需要额外的空间来存储辅助数组,因此其空间复杂度为O(k)。在实际应用中,我们可以根据问题的特点和数据的范围选择适合的排序算法以达到最优的时间复杂度和空间复杂度。