第 28 題:如何理解計數排序?
什麼是計數排序?
計數排序不是基於比較的排序演算法,其核心在於將輸入的資料值轉化為鍵儲存在額外開闢的陣列空間中。 作為一種線性時間複雜度的排序,計數排序要求輸入的資料必須是有確定範圍的整數
計數排序最重要的一點,確定範圍的整數,比如說範圍 0-10,那麼陣列裡面的值就要在 0-10 之間
栗子
序列:9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9 ,7,9
首先確定序列的範圍是 0-10,並且列出範圍的序列,如圖 1
比如第一個整數是 9,那麼陣列下標為 9 的元素加 1
#圖 1
第二個整數是 3,那麼陣列下標為 3 的元素加 1,如圖 2
#圖 2
以此類推重複遍歷…
最終遍歷完成後狀態如下,如圖 3
#圖 3
陣列每一個下標位置的值,代表了在序列中對應整數出現的次數
有了這個“統計結果”,排序就很簡單了。直接遍歷陣列,輸出陣列元素的下標值,元素的值是幾,就輸出幾次
0,1,1,2,3,3,3,4,4,5,5,6,7,7,8,9,9,9,9,10
最後輸出的序列已經是排好序的
這個時候可能會有人問,如果序列的最小值不是從 0 開始呢?
這個時候就要計算偏移量
如何計算偏移量?
以序列的最小值作為偏移量。比如最小值是 90, 那麼整數 95 對應的統計陣列下標就是 95-90 = 5
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/36/viewspace-2807017/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 第 30 題:如何理解基數排序?排序
- 看圖輕鬆理解計數排序排序
- KMP演算法(Leetcode第28題)KMP演算法LeetCode
- 15.百萬考生成績如何排序 - 計數排序排序
- 如何理解插入排序?排序
- 計數排序vs基數排序vs桶排序排序
- 計數排序排序
- Java排序之計數排序Java排序
- 基數排序的簡單理解排序
- 排序演算法__計數排序排序演算法
- 非交換排序-計數排序和桶排序排序
- 計數排序 - Counting Sort排序
- 基於桶的排序之計數排序排序
- (戀上資料結構筆記):計數排序、基數排序 、桶排序資料結構筆記排序
- 每週分享第 28 期
- 【資料結構與演算法】非比較排序(計數排序、桶排序、基數排序)資料結構演算法排序
- 計數排序 -- GoLang實現排序Golang
- 什麼是計數排序?排序
- 如何使用Python語言實現計數排序演算法?Python排序演算法
- 賽爾推薦 | 第28期
- 1122. 陣列的相對排序(計數排序 / 自定義排序)陣列排序
- JavaScript計數排序演算法JavaScript排序演算法
- 新學習的計數排序排序
- 理解希爾排序排序
- 經常提及的幾個js排序方法(氣泡排序、選擇排序、計數排序)JS排序
- 阿里雲前端週刊 – 第 28 期阿里前端
- 漫畫:什麼是計數排序?排序
- 資料結構之計數排序資料結構排序
- rust-algorithms:6-計數排序RustGo排序
- 第 4 章 程式計數器
- 如何理解JavaScript中常用的4種排序演算法?JavaScript排序演算法
- 劍指offer第49題 醜數
- leetcode的第9題:迴文數LeetCode
- F#週報2019年第28期
- Python經典程式設計習題100例:第19例:找完數Python程式設計
- 第三章:查詢與排序(下)----------- 3.27 用計數排序解決員工年齡問題排序
- 併發程式設計28題+JVM21題+Redis 16題+Java集合22題程式設計JVMRedisJava
- 第三章:查詢與排序(下)----------- 3.19 計數排序排序