>[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)
~~~
- 接触数据结构和算法
- 数据结构与算法 -- 大O复杂度表示法
- 数据结构与算法 -- 时间复杂度分析
- 最好、最坏、平均、均摊时间复杂度
- 基础数据结构和算法
- 线性表和非线性表
- 结构 -- 数组
- JS -- 数组
- 结构 -- 栈
- JS -- 栈
- JS -- 栈有效圆括号
- JS -- 汉诺塔
- 结构 -- 队列
- JS -- 队列
- JS -- 双端队列
- JS -- 循环队列
- 结构 -- 链表
- JS -- 链表
- JS -- 双向链表
- JS -- 循环链表
- JS -- 有序链表
- 结构 -- JS 字典
- 结构 -- 散列表
- 结构 -- js 散列表
- 结构 -- js分离链表
- 结构 -- js开放寻址法
- 结构 -- 递归
- 结构 -- js递归经典问题
- 结构 -- 树
- 结构 -- js 二搜索树
- 结构 -- 红黑树
- 结构 -- 堆
- 结构 -- js 堆
- 结构 -- js 堆排序
- 结构 -- 排序
- js -- 冒泡排序
- js -- 选择排序
- js -- 插入排序
- js -- 归并排序
- js -- 快速排序
- js -- 计数排序
- js -- 桶排序
- js -- 基数排序
- 结构 -- 算法
- 搜索算法
- 二分搜索
- 内插搜索
- 随机算法
- 简单
- 第一题 两数之和
- 第七题 反转整数
- 第九题 回文数
- 第十三题 罗马数字转整数
- 常见一些需求
- 把原始 list 转换成树形结构