计数排序JavaScript实现,极客时间学习笔记

// 计数排序JavaScript实现,极客时间学习笔记
// 需要排序的数组a
let a = [2, 5, 3, 0, 2, 3, 0, 3];
/* c的key代表着需要排序的数组中从小到
大的数值,value代表需要排序的数组中
该数值出现了几次 */
let c = [];
// 排序后的结果R
let R = [];
/* 第一步求出需要排序的数组中的最大值,
以便给出c中需要多少key来对应要排序的a中的从小到大的数值
*/
let max = a[0];
for (let i = 0; i < a.length - 1; i++) {
    if (max >= a[i]) {
        continue;
    }
    max = a[i];
}
console.log(max, 'max');// max=5;
// 获取value为0,key代表a中value的数组c
for (let i = 0; i <= max; i++) {
    c[i] = 0;
}
console.log(c, c.length, 'c');//[ 0, 0, 0, 0, 0, 0 ] 6 'c'

// 获取a中的每个值出现的个数,并将个数分配给c中的key对应的value;
for (let i = 0; i < a.length; i += 1) {
    c[a[i]]++;
}
console.log(c, 'c1');//[ 2, 0, 2, 3, 0, 1 ] 'c1'

/* 
计算排序中最关键的部分;对c的value依次累加,得出c2,
解释:在c2的第四个元素为7,表明小于或等于3的元素有‘七个’,
第六个元素表明小于等于5的元素有‘八个’,
至此,我们这里面提到的‘七个’和‘八个’,
就可以作为排序后的该元素在排序后的元素的游标index,
这是一种利用一个外部数组来进行辅助排序的做法,思路很巧妙,
计数排序一般只适合正整数场景低于负数可以进行加操作转换成正整数,
小数进行乘于某个数进行转化,
并且不适合排序中数组很小,而最大值过大的场景,如果这样得出的中间c太长
*/
for (let i = 1; i <= c.length - 1; i++) {
    c[i] = c[i - 1] + c[i];
}
console.log(c, 'c2');//[ 2, 2, 4, 7, 7, 8 ] 'c2'
for (let i = a.length - 1; i >= 0; i--) {
    let index = c[a[i]] - 1;
    R[index] = a[i];
    c[a[i]]--;
}
console.log(R, 'R');

扫描一起学算法啊

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值