计数排序是个啥?
Posted BBIot的小天地
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计数排序是个啥?相关的知识,希望对你有一定的参考价值。
计数排序,计数二字,代表了它不是基于比较的排序算法。
它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。
算法过程:
根据待排序集合中最大元素和最小元素的差值范围,申请额外空间;
遍历待排序集合,将每一个元素出现的次数记录到元素值对应的额外空间内;
对额外空间内数据进行计算,得出每一个元素的正确位置;
将待排序集合每一个元素移动到计算得出的正确位置上。
说白了就是:
假如输入的是数组C,C = [1,6,3,2,7];
额外定义一个新空数组B和A
C数组最大值是7,再加一得到额外空间8。
遍历C,将C中的数字值作为B中的index,
对应每个index做一个数字标记1。
循环B,取出非0的index位置作为A数组的值,返回
即为
B = [0, 0, 0, 0, 0, 0, 0, 0]; (7+1=8个位置)
B = [0, 1, 1, 1, 0, 0, 1, 1];
有1的index值是 1、2、3、6、7
A = [1, 2, 3, 6, 7]
js代码实现(对数组的计数排序):
function countingSort(arr){
var len = arr.length,
Result = [],
Count = [],
min = arr[0],
max = arr[0];
/*查找最大最小值,并将arr数置入Count数组中,统计出现次数*/
for(var i = 0;i<len;i++){
Count[arr[i]] = Count[arr[i]] ? Count[arr[i]] + 1 : 1;
min = min <= arr[i] ? min : arr[i];
max = max >= arr[i] ? max : arr[i];
}
/*从最小值->最大值,将计数逐项相加*/
for(var j = min;j<max;j++){
Count[j+1] = (Count[j+1]||0)+(Count[j]||0);
}
/*Count中,下标为arr数值,数据为arr数值出现次数;反向填充数据进入Result数据*/
for(var k = len - 1;k>=0;k--){
/*Result[位置] = arr数据*/
Result[Count[arr[k]] - 1] = arr[k];
/*减少Count数组中保存的计数*/
Count[arr[k]]--;
/*显示Result数组每一步详情*/
}
return Result;
}
var arr = [1,6,3,2,7];
console.log(countingSort(arr)); // [1,2,3,6,7]
以上是关于计数排序是个啥?的主要内容,如果未能解决你的问题,请参考以下文章