ACM基础(四):排序之计数排序 Counting Sort


一、思路

/**
A:待排序的数组
B:排序好的结果
C:外存数组, k表示外存数组的大小,这个大小是根据A中数的范围(最大值-最小值+1)
*/
COUNTING-SORT(A, B, k)
	/* 【操作】将外存数组清零
	 【用途】为了后面统计个数要从0开始自增
	 */
	for i ← 1 to k
		do	C[i]0
	
	/* 【理解】C的下标i分别对应"A中元素值为i的值"(i==A[j])
	 C中每个元素的值就是A中元素值为i的"元素个数"(C[i] = sum(A[1...length[A]]=i))
	 【操作】遍历A中的每个数,将A中每个数的值,当作C的索引,对该值C[A[j]]+1
	 【用途】用来统计A中每个数出现的次数,记录在C中
	 */
	for j ← 1 to length[A]
		do	C[A[j]] ← C[A[j]] + 1
	
	/* 【理解】C中每个元素的值就是A中元素值小于等于i的"元素个数"(C[i] = sum(A[1...length[A]]<=i))
	 【操作】遍历C中第二个元素到最后一个元素,将本数加上前一个数。
	 【用途】C下标表示从小到大的待排序数据值,
	 并且相加后C中每个元素的值就表示C下标即待排序的某数是第几大。
	 所以就是用来确定填写到B数组中的位置。
	 */
	for i ← 2 to k
		do	C[i] ← C[i] + C[i-1]
	
	/* 【操作】倒着遍历A,在C中将A[i]作为下标查找将其填入B中对应的位置C[A[j]],并自减C[A[j]]供下一个相同值的元素查找
	 【理解】正序遍历也可以,但却颠倒了相同元素在A中前后顺序。
	 因此,倒序遍历是保持计数排序"稳定"的关键。
	 【用途】输出结果
	 */
	for j ← length[A] downto 1
		do	B[C[A[j]]] ← A[j]
			C[A[j]] ← C[A[j]] - 1
  1. 清零:在这里插入图片描述

  2. 统计个数:在这里插入图片描述

  3. 确定位置:
    在这里插入图片描述

  4. 输出结果:
    在这里插入图片描述

二、时间复杂度

在这里插入图片描述
所以, Θ ( k ) + Θ ( n ) + Θ ( k ) + Θ ( n ) = 2 Θ ( k + n ) \Theta(k)+\Theta(n)+\Theta(k)+\Theta(n)=2\Theta(k+n) Θ(k)+Θ(n)+Θ(k)+Θ(n)=2Θ(k+n),舍去常系数,结果就是 Θ ( k + n ) \Theta(k+n) Θ(k+n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值