【C# 排序】计数排序(Counting Sort)

视频地址:https://www.bilibili.com/video/BV1464y1F7Yx/?spm_id_from=autoNext

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。

算法描述   

    找出待排序的数组中最大和最小的元素;
    统计数组中每个值为i的元素出现的次数,存入数组C的第i项,将i作为数组的索引,同时也做为元素的值;
    对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
    反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。

缺点:

(1)浪费空间

(2)不能统计负数

(3)不能稳定

 

改进方案:

视频位置: 33分钟处

(1)数组和索引分开。定义一个结构体,里面包含元素值和count,count2,然后用这个结构体创建数组。count:统计元素出现的次数,count2:前面所有元素出现的次数总和+1,表示元素在排序后的有序数组中的位置。

 

 (2)

 

 

 

动图演示

 使用范围

对一定范围之内的整数排序

虽然计数排序看上去很强大,但是它存在两大局限性

1.当数列最大最小值差距过大时,并不适用于计数排序

比如给定20个随机整数,范围在0到1亿之间,此时如果使用计数排序的话,就需要创建长度为1亿的数组,不但严重浪费了空间,而且时间复杂度也随之升高。

2.当数列元素不是整数时,并不适用于计数排序

如果数列中的元素都是小数,比如3.1415,或是0.00000001这样子,则无法创建对应的统计数组,这样显然无法进行计数排序。

正是由于这两大局限性,才使得计数排序不像快速排序、归并排序那样被人们广泛适用。

稳定性

稳定

 

时间和空间复杂度

时间复杂度:O(n + k)

空间复杂度是O(K)

posted @ 2022-06-14 20:33  小林野夫  阅读(317)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/