因爲LeetCode上的算法題不少涉及到一些基礎的數據結構,爲了更好的理解後續更新的一些複雜題目的動畫,推出一個新系列 -----《圖解數據結構》,主要使用動畫來描述常見的數據結構和算法。本系列包括十大排序、堆、隊列、樹、並查集、圖等等大概幾十篇。git
你能夠在公衆號 五分鐘學算法 獲取更多排序內容github
計數排序是一種非基於比較的排序算法,其空間複雜度和時間複雜度均爲O(n+k),其中k是整數的範圍。基於比較的排序算法時間複雜度最小是O(nlogn)的。該算法於1954年由 Harold H. Seward 提出。算法
計數排序的核心在於將輸入的數據值轉化爲鍵存儲在額外開闢的數組空間中。做爲一種線性時間複雜度的排序,計數排序要求輸入的數據必須是有肯定範圍的整數。編程
花O(n)的時間掃描一下整個序列 A,獲取最小值 min 和最大值 max數組
開闢一塊新的空間建立新的數組 B,長度爲 ( max - min + 1)數據結構
數組 B 中 index 的元素記錄的值是 A 中某元素出現的次數數據結構和算法
最後輸出目標整數序列,具體的邏輯是遍歷數組 B,輸出相應元素以及對應的個數編程語言
首先,掃描一下整個序列動畫
得到最小值爲 2 ,最大值爲 73d
新建數組包含 2~7 的元素
再次掃描序列,將序列的值放置在新建數組中
掃描數字 5,數組中 index 爲 3 的值爲 5,次數爲 1
掃描數字 3,數組中 index 爲 1 的值爲 3,次數爲 1
掃描數字 4,數組中 index 爲 2 的值爲 4,次數爲 1
掃描數字 7,數組中 index 爲 5 的值爲 7,次數爲 1
掃描數字 2,數組中 index 爲 0 的值爲 2,次數爲 1
掃描數字 4,數組中 index 爲 2 的值爲 4,次數爲 2
掃描數字 3,數組中 index 爲 1 的值爲 3,次數爲 2
按照這種節奏,掃描結束後,新建數組中存放了整個序列以及每一個數字出現的次數
最後輸出目標整數序列
輸出數字 2,同時數組中 index 爲 0 的值爲 2 的元素次數變爲 0
輸出數字 3,同時數組中 index 爲 1 的值爲 3 的元素次數變爲 1
一樣的操做,整個序列就徹底輸出了
爲了更好的讓讀者用本身熟悉的編程語言來理解動畫,筆者將貼出多種編程語言的參考代碼,代碼所有來源於網上。
若是你是iOS開發者,能夠在GitHub上 github.com/MisterBooo/… 獲取更直觀可調試運行的源碼。
你能夠在公衆號 五分鐘學算法 獲取更多排序內容