>[success] # 计数排序 [就看这一个就够了](https://juejin.im/post/6844904191865913351) ~~~ 1.计数排序是分布式排序,这种排序和我们之前的排序不同点在于,之前的排序都是相互比较 确认位置,'计数排序'不存在元素之间的比较和交换操作 2.'计数排序'只能针对正整数,因为他的解决思路是 2.1.找到你整个数组中'最大值',以此创建数组,这里很好理解 举个例子: '[2,10,5,6,7,15]',那这里最大值是15,创建一个十五长度数组,将值依次插入他们 对应的数组脚标,则默认排序完成 ~~~ ![](https://img.kancloud.cn/82/7d/827d96b8ca3682e8775f4916f22b45ac_1012x557.gif) >[info] ## js 代码实现 ~~~ 1.需要写一个找到最大值的方法,这个方法用到的思路就是等价替换法 2.需要真正排序的方法,他要做的就是将这些值依次加到这个以最大值创建的数组对应脚标位置里, 当然对应脚本中我们存的是个数,这个具体的思路看开头的文章 ~~~ >[danger] ##### 代码实现 ~~~ 1.整个这里最绕的就是,脚标才是我们存储的数据信息,内容存储的是这个数据实际出现几次 ~~~ ~~~ function countingSort(array){ // 判断如果数组长度不大于2没有排序的必要 if(array.length<2){ return array } const maxValue = findMaxValue(array) const counts = new Array(maxValue+1) // 循环array 的值相当于是我们创建counts对应脚标 array.forEach(item => { if(!counts[item]){ counts[item] = 0 } counts[item] ++ }) let sortedIndex = 0 counts.forEach((count, index) => { while(count>0){ array[sortedIndex++] = index // 把对应脚标存入,脚标是我们实际数据值 count -- } }) return array; } // 获取最大值为了创建数组用 function findMaxValue(array) { let max = array[0] array.forEach((item)=>{ if(item > max){ max = item } }) return max } const array = countingSort([9,15,2,5,16,7,18]) console.log(array) ~~~