一、計數排序
計數排序是將序列中的數值轉化為陣列的下標,當數字a出現一次時,就把陣列中對應a下標的值加1。這些資料需要存放在額外開闢的陣列空間中(我們把該陣列成為統計陣列),計數排序的時間複雜度為線性的,它適用於在一定範圍內的整數排序,在取值範圍不是很大的情況下,它的效能可以超過那些時間複雜度為o(nlogn)的排序。
當待排序的資料為95、94、91、98、99、90、99、93、91、92時,我們還以數列的最大值來決定統計陣列的長度時,要建立乙個長度為100的陣列,那麼從0-89的位置空間就都浪費了。
所以:優化一:我們不再以輸入數列的最大值+1作為統計陣列的長度,而是以數列最大值-最小值+1作為陣列的長度即可。同時,以最小值作為乙個偏移量,用於計算整數在統計陣列中的下標。
這樣:95、94、91、98、99、90、99、93、91、92在統計陣列中存的位置分別為:5,4,1,8,9,0,9,3,1,2
另外:當陣列中多個資料相同時,為了不打亂相同資料的位置,使排序演算法具有一定的穩定性,我們需要進行進一步優化。
優化二:從統計陣列的第二個元素開始,每乙個元素都加上前面所有元素之和,這樣統計陣列中的數值大小就代表了該資料在序列中所處的位置。最後輸出的時候,從後向前遍歷。
二、優化**
def
countsort_improve
(arr=
):max_value=
max(arr)
min_value=
min(arr)
# 根據最大值和最小值得出統計陣列的長度
countarray_length=max_value-min_value+
1 count_array=[0
]*countarray_length # 對統計陣列進行初始化
for i in
range
(len
(arr)):
count_array[arr[i]
-min_value]+=1
# 統計陣列做變形,後面的元素等於前面的元素之和
for i in
range(1
,len
(count_array)):
count_array[i]
=count_array[i]
+count_array[i-1]
sorted_array=[0
]*len(arr)
# 對原陣列倒序輸出
演算法 計數排序及優化
計數排序並不是傳統意義的比較排序,即並非通過數字之間的相互比較來決定順序。思想 遍歷陣列arr,將arr i 所為索引,arr i 出現的次數作為值存入新的陣列中,通常稱為桶,因為arr i 就是新陣列中的索引,這個數字越大,在桶中的位置越靠後,這個過程即是在排序。例如 arr 1,4,3,0,2,...
計數場景的優化
前言 社交網路資訊爆發,如何衡量你在社交 上的影響力?計數!今天著重介紹下redis在計數器場景上的應用。正文 對於計數器大家肯定還有或多或少的疑問。q1 計數從 來?通常我們發布的社交內容會儲存在資料庫中,最常見的如mysql 更新索引 insert into user message uid,m...
python計數排序 Python 計數排序
1.python coding utf 8 def counting sort a,b,k 計數排序,偽碼如下 counting sort a,b,k 1 for i 0 to k 初始化儲存區的值 2 do c i 0 3 for j 1 to length a 為各值計數 4 do c a j ...