// 计数排序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');
计数排序JavaScript实现,极客时间学习笔记
最新推荐文章于 2023-03-01 20:51:36 发布