對於給定整數數列,我們可以採取歸併排序將其整理成乙個有序數列。然而,其時間複雜度為o(n)=nlogn。若給出乙個數列,其元素在數軸上分布「密集」,則我們不必使用歸併排序,而可以用歸併排序。
使用計數排序來對這個列表進行排序。其時間複雜度為o(n)=(n+m),空間複雜度為o(m)。其中n為數列長度,m為數列中最大元素與最小元素之差。
在面對分布密集的元素時,可以有效減少運算所需的時間,但是,為了實現穩定的計數排序,我們需要建立乙個二維列表來儲存物件的位置,且第二維表現為乙個佇列。
綜上,計數排序適合密集分布的列表,尤其是m為了使實現簡潔直觀,在程式中我們要將一些元組進行排序,其第0個元素作為實際大小,第1個元素作為其「標籤」。在其他情況中,可以先實現相應類的比較器,再進行比較。
counting_sort
def counting_sort(a):
max=a[0][0]
min=a[0][0]
#遍歷取得最大值
for i in range(len(a)):
if a[i][0]>max:
max=a[i][0]
if a[i][0]=[(
9,1)
,(4,
1),(
5,1)
,(6,
1),(
9,2)
,(8,
1),(
1,1)
,(1,
2),(
9,3)
,(4,
2),(
7,1)
,(4,
3),(
2,1)
]output=counting_sort(inputlist)
print
("input list:"
,inputlist)
print
("sorted lis:"
,output)
輸出結果
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-nhzoeork-1607259317808)(穩定的計數排序實現.assets/測試.png)]
可見我們實現了穩定的計數排序
可見我們實現了穩定的計數排序
計數排序與穩定排序
我們常用的排序演算法,有冒泡演算法 快速演算法等,它們都是基於元素之間的比較來進行排序,有一種特殊的演算法不是基於元素比較,而是利用陣列下標來確定元素在陣列的位置,這種演算法就是 計數排序 先來說一下實現的原理,假設有20個隨機整數的陣列array,他們值分別是 9,3,5,4,9,1,2,7,8,...
排序演算法 最穩定的計數排序
有沒有一種排序演算法的時間複雜度為o n 呢?如果面試官這麼問你,千萬不要直接否定!事實上是有線性時間複雜度的排序演算法,只不過其使用條件有限,只能是滿足條件的整數 0 n 序列,而且需要一定的輔助空間。這就是我們即將要提到的 計數排序。對於排序演算法來說計數排序是穩定的,跟桶排序相比其所占用的空間...
穩定版計數排序
相比樸素版計數排序,可以保證排序後陣列中相等元素原本的先後順序不變。class solution 2.建立統計陣列並統計對應元素個數 int m maxval minval 1 vector int temp m for int i 0 i 3.統計陣列做變形,後面的元素等於前面的元素之和 int ...