• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

计数排序 Rust实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

计数排序

计数排序假设n个输入元素都是0k区间的一个整数(k为某整数)
kO(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;
}

然后计算对于i0..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);
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab实现模糊聚类之IsoData算法111发布时间:2022-07-18
下一篇:
【转】Matlab axis用法 - Hapos发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap