【算法】计数排序

1. 简介

计数排序(counting sort)于1954年由哈罗德·H·西华德Harold H. Seward)提出。计数排序是一种基于数组键值的正整数排序算法,通过对等于不同键值的数据进行计数,从而获得待排序序列的位置关系。由此,这种算法不是基于比较排序,并且比较排序的性能下限 O ( n log ⁡ n ) O{\left(n\log n \right)} O(nlogn)不适用于计数排序。计数排序的时间复杂度和空间复杂度都为 O ( n + k ) O{\left(n+k\right)} O(n+k)

计数排序与其他算法不同,需要一些前提条件:

  1. 待排序序列中每个元素的值都 ≥ 0 \ge 0 0
  2. 待排序序列数组的键值都 ≥ 0 \ge 0 0
  3. 知道待排序序列中的最大值 k。(不知道的情况下,则遍历待排序序列求得最大值)

2. 步骤

  1. 根据最大值 k 申请一个长度为 k + 1 的数组以存储元素计数,并且全部初始化为 0。可以把这个序列叫做计数数组
  2. 申请一个和待排序序列等长的数组用以存储排序后的数据。
  3. 遍历待排序序列,如果元素等于计数数组的键值,则键值的值 +1
  4. 根据计数序列的值计算演算出所有位置(索引数列)。
  5. 再次遍历待排序序列将,所有数放入计数序列的指定位置。

举例:
待排序序列为:

0 1 2 3 4 5 6 7 8 9
1 3 6 0 6 3 5 2 5 2

得最大值为 k = 6 申请一个长度为 k + 1 的计数数组

0 1 2 3 4 5 6
0 0 0 0 0 0 0

计数数组的键值等于待排序元素的值,遍历待排序序列得计数数组为:

0 1 2 3 4 5 6
1 1 2 2 0 2 2

接着就是根据计数数组得元素的排序位置(不断累加计数):

0 1 2 3 4 5 6
计数 1 1 2 2 0 2 2
索引 0 + 1 = 1 0+{\color{red}1}={\color{red}1} 0+1=1 1 + 1 = 2 1+{\color{red}1}={\color{green}2} 1+1=2 2 + 2 = 4 2+{\color{green}2}={\color{blue}4} 2+
  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值