1.计数排序特点
1.一般输入的关键字都在0到k区间内的一个整数,其中k为某个整数;
2.当输入的元素个数为n时,排序的时间复杂度为O(n);
3.计数排序需要额外的空间,k越大需要的额外空间越大,因为需要k长度的数组;
2.计数排序介绍
计数排序的基本思路:对每一个输入元素x,确定小于x的元素个数(假设为a),那么x可放到输出数组的a位置上。例如,如果有10个元素小于x,则x就应该放在第11个输出的位置上。
3.计数排序的伪代码
假设输入是一个数组A [0..n-1],A.length = n。需要另外两个数组:B[0..n-1]存放排序后输出,C[0..k]提供计数使用。
COUNTING-SORT(A,B,k)
let C[0,k] to be a new array
// 重置C[0..k]个元素为0
for i = 0 to k
C[i] = 0;
// A[0..n-1]数组中A[j]有几个计数在C[A[j]]上
for j = 0 to A.length -1
C[A[j]] = C[A[j]] + 1
// 计算A[0..n-1]中比A[j]小的个数,即C[0..k]中比A[j]下标小的计数之和(这里需要理解一下,
//比如A[10] = 30,那么C[0..29]是对应A[0..n-1]数组中0到29的个数,0到29可能有些数没有,对应的个数为0)
for i = 1 to k
C[i] = C[i] + C[i - 1] // C[i]即为i = A[x]的小于等于i的个数
// 把A[0..n-1]排序输出到B[0..n-1]
for j = A.length-1 downto 0
count = C[A[j]]
B[count -1] = A[j]
C[A[j]] = C[A[j]] - 1 // 把A[j]的个数减1
图解步骤如下:
算法-计数排序1.png
网友评论