• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2020-05-08 16:30 Aet 隐藏边栏 |   抢沙发  4 
文章评分 3 次,平均分 5.0

简述

计数排序适用于对一定范围内的元素进行排序。

它的思路就是创建一个范围性的计数数组,用下标去对应元素的值,有几个元素,相应下面命中几次。然后根据元素命中次数对下标值进行一次输出,得到的序列就是有序的序列。

它是不需要进行元素比较。

注意:

  • 当数列最大和最小值差距过大时,不适合使用计数排序
  • 当数列元素不是整数时,也不适合用计数排序

复杂度

名称 最好 平均 最差 空间 稳定性
计数排序 n+m n+m n+m m

初步实现

优化版1.0

由于我们在实现统计数组的时候,是以待定排序数组中值最大的元素为标准,创建统计数组的。这样就会有一个不太好的地方,比如:

数组里只有10多个元素,但是取值范围是:【80,100】之间,按上个实现去设计的话,我们需要创建一个差不多能包括90多个元素空间大小的统计数组,这是完全没有必要的。

解决方法就是不再以输入序列中元素的最大值作为统计数组的长度,而是最大值-最小值+1作为统计数组的长度。

算法导论

计数排序思想,假设对数组A[p...r]排序,其中数组中所有元素都为正整数,并且都是小于max_val:

  • 首先对A进行计数。对每一个元素A[i],将它出现的次数存放在CounterArray[A[i]]中
  • 然后对CounterArray累加,得出A[i]应该在结果序列中排多少位
  • 最后在结果数组中直接放置A[i](根据它的排位)
  • 时间复杂度 O(n)
  • 空间复杂度 O(n)
    这里必须对整数才能采取计数排序。由static_assert(...,...)确保

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2021-11-20
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享