排序算法__计数排序
一.说明
计数排序是非比较型排序
待排序集合键为整数
键的最大值为k
Time~O(n+k)
Space~O(n+k)
二.举例
1.遍历原数组A,累计写入累计数组B
2.加和累计数组,得到元素位置
3.写回结果数组C
每次写回一个元素后,累计数组B中的元素位置减1,因为会有相同元素!
三.代码
var counting_sort=function(A){
// A__待排序数组
// 求原数组的最大值
const max=Math.max(...A)
// 累计数组__数组长度=原数组最大值+1
const B=Array(max+1).fill(0)
// 结果数组__与原数组长度相同
const C=Array(A.length)
// 1.遍历原数组,累计写入累计数组
A.forEach((item,index) => {
B[A[index]]++
});
// 2.加和累计数组,得到元素位置
for(let i=1;i<B.length;i++){
B[i]=B[i]+B[i-1]
}
// 3.写入结果数组
for(let i=0;i<A.length;i++){
// 写回位置
const p=B[A[i]]-1
B[A[i]]--
C[p]=A[i]
}
return C
}
var Arr=[6,5,3,3,2,2,1]
console.log(counting_sort(Arr) //[1,2,2,3,3,5,6]