计数排序是个啥?

Posted BBIot的小天地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计数排序是个啥?相关的知识,希望对你有一定的参考价值。


计数排序,计数二字,代表了它不是基于比较的排序算法。

它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。


算法过程:

  1. 根据待排序集合中最大元素和最小元素的差值范围,申请额外空间;

  2. 遍历待排序集合,将每一个元素出现的次数记录到元素值对应的额外空间内;

  3. 对额外空间内数据进行计算,得出每一个元素的正确位置;

  4. 将待排序集合每一个元素移动到计算得出的正确位置上。


说白了就是:

     假如输入的是数组C,C = [1,6,3,2,7]; 

     额外定义一个新空数组B和A

  1. C数组最大值是7,再加一得到额外空间8。

  2. 遍历C,将C中的数字值作为B中的index,

  3. 对应每个index做一个数字标记1。

  4. 循环B,取出非0的index位置作为A数组的值,返回


即为

  1. B = [0, 0, 0, 0, 0, 0, 0, 0]; (7+1=8个位置)

  2. B = [0, 1, 1, 1, 0, 0, 1, 1];

  3. 有1的index值是 1、2、3、6、7

  4. 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]


以上是关于计数排序是个啥?的主要内容,如果未能解决你的问题,请参考以下文章

天天用Synchronized,底层原理是个啥?

代码覆盖率是个啥概念?

代码覆盖率是个啥概念?

2017 10 14(吐槽初赛)

吵疯了,Pull Request到底是个啥?

话说Spring 5里的WebFlux到底是个啥?