计数排序

计数排序(Count Sort)是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。

计数排序的思想类似于哈希表中的直接定址法,在给定的一组序列中,先找出该序列中的最大值和最小值,从而确定需要开辟多大的辅助空间,每一个数在对应的辅助空间中都有唯一的下标。

  1. 找出序列中最大值和最小值,开辟Max-Min+1的辅助空间
  2. 最小的数对应下标为0的位置,遇到一个数就给对应下标处的值+1,。
  3. 遍历一遍辅助空间,就可以得到有序的一组序列

这里写图片描述

void CountSort(int* array,int size)
{
    assert(array);
    int max = array[0];//序列中的最大值
    int min = array[0];//序列中的最小值
    for(int i = 0;i < size;++i)
    {
        if(array[i] >= max)
        {
            max = array[i];
        }
        else
        {
            min = array[i];
        }
    }
    int range = max - min + 1;//需要开辟的空间大小
    int* count = new int[range];
    memset(count,0,sizeof(int)*range);//辅助空间初始化为0,0代表没有那个数

    for(int i = 0;i < size;++i)
    {
        count[array[i] - min]++;//array[i]-min是将该数对应到辅助空间的下标
    }
    int index = 0;
    for(int i = 0;i < range;++i)//遍历辅助空间
    {
        while(count[i]--)//下标处的数值是几,说明该数出现了几次
        {
            array[index++] = i + min;//将下标处的数对应回原数组
        }
    }
    delete[] count;
}

算法分析
计数排序是一种以空间换时间的排序算法,并且只适用于待排序列中所有的数较为集中时,比如一组序列中的数据为0 1 2 3 4 999;就得开辟1000个辅助空间。
时间复杂度
计数排序的时间度理论为O(n+k),其中k为序列中数的范围。
不过当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n*log(n)), 如归并排序,堆排序)

  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
计数排序(Counting Sort)是一种非比较型整数排序算法,它对输入的数据进行计数,然后根据计数值直接输出排序结果。计数排序适用于数据规模较小且数据分布均匀的情况,它的时间复杂度为O(n+k),其中n是输入数据的数量,k是输入数据的最大值。 在Python中实现计数排序的代码示例如下: ```python def counting_sort(arr): # 确定最大值和计数数组的长度 max_val = max(arr) count_len = max_val + 1 # 初始化计数数组 count = * count_len # 统计每个元素出现的次数 for num in arr: count[num] += 1 # 计算每个元素应该放置的位置 for i in range(1, count_len): count[i] += count[i-1] # 创建输出数组并排序 output = * len(arr) for num in arr: output[count[num]-1] = num count[num] -= 1 return output ``` 上述代码中,我们首先确定输入数组中的最大值,并根据最大值创建一个计数数组,长度为最大值加一。然后统计输入数组中每个元素出现的次数,并将计数结果存入计数数组。接下来,我们通过累加计数数组中的元素,计算每个元素应该放置的位置。最后,我们根据计数数组中的计数值和位置信息,将输入数组中的元素排序并输出。 使用计数排序算法对整数数组进行排序的时间复杂度为O(n+k),空间复杂度为O(n)。在Python中实现计数排序算法时,需要占用一定的额外空间来存储计数数组和输出数组。但是,计数排序算法的稳定性较好,适用于整数数组的排序。在实际应用中,需要根据具体的数据规模和分布情况选择合适的排序算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值