計數排序的優化

2021-10-06 05:45:45 字數 1780 閱讀 6758

一、計數排序

計數排序是將序列中的數值轉化為陣列的下標,當數字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 ...