拜託,面試別再問我計數排序了!!!
排序,面試中,問的比較多。
時間複雜度為O(n)的排序,除了 基數排序 (Radix Sort) ,還有 計數排序 (Counting Sort) 。今天,1分鐘,通過幾幅圖,爭取讓大家搞懂計數排序。
計數排序的適用範圍?
待排序的元素在某一個範圍[MIN, MAX]之間 。
畫外音:很多業務場景是符合這一場景,例如uint32的數字排序位於[0, 2^32]之間。
計數排序的空間複雜度?
計數排序需要一個輔助空間, 空間大小為O(MAX-MIN) ,用來儲存所有元素出現次數(“計數”)。
畫外音:計數排序的核心是,空間換時間。
計數排序的關鍵步驟?
步驟一 :掃描待排序資料 arr[N] ,使用計數陣列 counting[MAX-MIN] ,對每一個 arr[N] 中出現的元素進行計數;
步驟二 :掃描計數陣列 counting[] ,還原 arr[N] ,排序結束;
舉個 栗子 :
假設待排序的陣列,
arr={5, 3, 7, 1, 8, 2, 9, 4, 7, 2, 6, 6, 2, 6, 6}
很容易發現,待 排序的元素在[0, 10]之間 ,可以用 counting[0,10] 來儲存計數。
第一步:統計計數
掃描未排序的 陣列 arr[N] ,對每一個出現的元素進行計數。
掃描完畢後,計數陣列 counting[0, 10] 會變成上圖中的樣子,如 粉色示意 , 6 這個元素在 arr[N] 中出現了 4 次,在 counting[0, 10] 中, 下標為6 的位置 計數是4 。
第二步:還原陣列
掃描計數陣列 counting[0, 10] ,通過每個元素的計數,還原 arr[N] 。
如上圖粉色示意, count[0, 10] 下標為6 的位置 計數是4 ,排完序是 4個連續的6 。
從counting下標MIN到MAX,逐個還原,填滿 arr[N] 時,排序結束。
神奇不神奇!!!
計數排序 (Counting Sort) ,總結:
● 計數排序, 時間複雜度為O(n) ;
● 當待排序元素個數很多,但值域範圍很窄時,計數排序是很節省空間的;
希望這一分鐘,大家有收穫。
原文釋出時間為:2018-10-22
本文作者: 58沈劍