计数排序
计数排序假设n
个输入元素都是0
到k
区间的一个整数(k
为某整数)
当k
为O(n)
时,排序的时间为O(n)
计数排序基本思想是:对于每个输入元素x
, 确定小于x
的元素个数
先新建一个可变数组c, 初始化为0
let mut c: Vec<usize> = Vec::with_capacity(k); for i in 0..k+1 { c.push(0); }
c记录a中每个元素出现的个数
for i in 0..a.len() { c[a[i]] = c[a[i]] + 1; }
然后计算对于i
从0..k
, 有多少个元素是小于等于i
for i in 1..k+1 { c[i] = c[i] + c[i-1]; }
最后把元素a[i]放入数组b的正确位置上
for i in (0..a.len()).rev() { b[c[a[i]]-1] = a[i]; c[a[i]] = c[a[i]] - 1; }
- 计数排序的时间代价为
O(k+n)
, 当k=O(n)
时, 一般会采用计数排序 - 该排序不是比较排序, 而是根据元素的值来确定元素的位置
- 计数排序是稳定的
全部代码如下:
fn count_sort(a: &mut [usize], b: &mut [usize], k: usize) { let mut c: Vec<usize> = Vec::with_capacity(k+1); for _ in 0..k+1 { c.push(0); } for i in 0..a.len() { c[a[i]] = c[a[i]] + 1; } for i in 1..k+1 { c[i] = c[i] + c[i-1]; } for i in (0..a.len()).rev() { b[c[a[i]]-1] = a[i]; c[a[i]] = c[a[i]] - 1; } } fn main() { let mut a: [usize; 8] = [2,5,3,0,2,3,0,3]; let mut b = [0usize; 8]; count_sort(&mut a, &mut b, 5); println!("{:?}", b); }
来源:https://www.cnblogs.com/kwebi/p/9644536.html