算法導論 — 8.2 計數排序

筆記

假設輸入的nn個元素中的每一個都是在00 ~ kk內的一個整數。kk表示了輸入元素所處的範圍。一般在kk遠小於nn時,可以採用計數排序算法。
  計數排序的基本思想是:對每一個輸入元素xx,確定小於xx的元素個數。利用這一信息,可以直接把xx放到正確的位置。例如,如果有1717個元素小於xx,則x就應該放在第1818個位置上。
  以下爲計數排序的僞代碼。假設輸入數組爲A[1..n]A[1..n],輸出數組爲B[1..n]B[1..n],另外還有一個數組C[0..k]C[0..k]提供臨時存儲空間。
  在這裏插入圖片描述
  下圖給出了一個例子,輸入數組爲<2,5,3,0,2,3,0,3><2, 5, 3, 0, 2, 3, 0, 3>
  在這裏插入圖片描述
  在計數排序的僞代碼中,第22 ~ 33行的for循環所花時間爲Θ(k)Θ(k),第44 ~ 55行的for循環所花時間爲Θ(n)Θ(n),第77 ~ 88行的for循環所花時間爲Θ(k)Θ(k),第1010 ~ 1212行的for循環所花時間爲Θ(n)Θ(n)。這樣,計數排序總的時間代價爲Θ(k+n)Θ(k+n)。在實際應用中,一般在k=O(n)k = O(n)時纔會應用計數排序,此時計數排序的運行時間爲Θ(n)Θ(n)
  在8.1節,我們得到結論,比較排序的運行時間的下界爲Ω(nlgn)Ω(n{\rm lg}n)。然而計數排序的運行時間是優於Ω(nlgn)Ω(n{\rm lg}n)的,因爲它並不是一個比較排序算法。
  計數排序還是一個穩定排序算法,這一玄機在於僞代碼的第1010行,從後向前遍歷輸入數組A[1..n]A[1..n]。假如在A[1..n]A[1..n]存在一組數值相同的元素,位置靠後的元素先取出,它在輸出數組中的位置也相對靠後;而位置靠前的元素後取出,它在輸出數組中的位置也相對靠前。

練習

8.2-1 參照圖8-2的方法,說明COUNTINGSORTCOUNTING-SORT在數組A=<6,0,2,0,1,3,4,6,1,3,2>A = <6, 0, 2, 0, 1, 3, 4, 6, 1, 3, 2>上的操作過程。
  
  在這裏插入圖片描述
  
8.2-2 試證明COUNTINGSORTCOUNTING-SORT是穩定的。
  

8.2-3 假設我們在COUNTINGSORTCOUNTING-SORT的第10行循環的開始部分,將代碼改寫爲:
  在這裏插入圖片描述
  試證明該算法仍然是正確的。它還穩定嗎?
  

8.2-4 設計一個算法,它能夠對於任何給定的介於00kk之間的nn個整數先進行預處理,然後在O(1)O(1)時間內回答輸入的nn個整數中有多少個落在區間[a..b][a..b]內。你設計的算法的預處理時間應爲Θ(n+k)Θ(n+k)
  
  以下直接給出僞代碼。
  在這裏插入圖片描述

本節相關代碼鏈接:
  https://github.com/yangtzhou2012/Introduction_to_Algorithms_3rd/tree/master/Chapter08/Section_8.2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章