筆記
假設輸入的個元素中的每一個都是在 ~ 內的一個整數。表示了輸入元素所處的範圍。一般在遠小於時,可以採用計數排序算法。
計數排序的基本思想是:對每一個輸入元素,確定小於的元素個數。利用這一信息,可以直接把放到正確的位置。例如,如果有個元素小於,則x就應該放在第個位置上。
以下爲計數排序的僞代碼。假設輸入數組爲,輸出數組爲,另外還有一個數組提供臨時存儲空間。
下圖給出了一個例子,輸入數組爲。
在計數排序的僞代碼中,第 ~ 行的for循環所花時間爲,第 ~ 行的for循環所花時間爲,第 ~ 行的for循環所花時間爲,第 ~ 行的for循環所花時間爲。這樣,計數排序總的時間代價爲。在實際應用中,一般在時纔會應用計數排序,此時計數排序的運行時間爲。
在8.1節,我們得到結論,比較排序的運行時間的下界爲。然而計數排序的運行時間是優於的,因爲它並不是一個比較排序算法。
計數排序還是一個穩定排序算法,這一玄機在於僞代碼的第行,從後向前遍歷輸入數組。假如在存在一組數值相同的元素,位置靠後的元素先取出,它在輸出數組中的位置也相對靠後;而位置靠前的元素後取出,它在輸出數組中的位置也相對靠前。
練習
8.2-1 參照圖8-2的方法,說明在數組上的操作過程。
解
8.2-2 試證明是穩定的。
略
8.2-3 假設我們在的第10行循環的開始部分,將代碼改寫爲:
試證明該算法仍然是正確的。它還穩定嗎?
略
8.2-4 設計一個算法,它能夠對於任何給定的介於到之間的個整數先進行預處理,然後在時間內回答輸入的個整數中有多少個落在區間內。你設計的算法的預處理時間應爲。
解
以下直接給出僞代碼。
本節相關代碼鏈接:
https://github.com/yangtzhou2012/Introduction_to_Algorithms_3rd/tree/master/Chapter08/Section_8.2