>[success] # 計數排序
[就看這一個就夠了](https://juejin.im/post/6844904191865913351)
~~~
1.計數排序是分布式排序,這種排序和我們之前的排序不同點在于,之前的排序都是相互比較
確認位置,'計數排序'不存在元素之間的比較和交換操作
2.'計數排序'只能針對正整數,因為他的解決思路是
2.1.找到你整個數組中'最大值',以此創建數組,這里很好理解 舉個例子:
'[2,10,5,6,7,15]',那這里最大值是15,創建一個十五長度數組,將值依次插入他們
對應的數組腳標,則默認排序完成
~~~

>[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 轉換成樹形結構