from __future__ import print_function
defcounting_sort
(collection)
:"""
計數排序
演算法思想:
假設要排序的陣列為 a = 這裡最大值為3,最小值為0,
那麼我們建立乙個陣列c,長度為3+1-0=4。然後一趟掃瞄陣列a,得到a中各個元素的總數,
並保持到陣列c的對應單元中。比如0 的出現次數為2次,則 c[0] = 2;1 的出現次
數為4次,則c[1] = 4。c=[2,4,0,1]由於c 是以a的元素為下標的,所以這樣一做,a中的元素在c
中自然就成為有序的了,然後我們分別統計比0,1,3小的元素個數,如比1小(包括1)的元素有6個。更新
c,c=[2,6,0,7],更新c是為了保證排序穩定。然後把這個在c中的記錄按每個元素的計數展開到輸出陣列b中,
排序就完成了。 也就是b[0] 到 b[1] 為0, b[2] 到 b[5] 為1 這樣依此類推。
examples:
>>> counting_sort([0, 5, 3, 2, 2])
[0, 2, 2, 3, 5]
>>> counting_sort()
>>> counting_sort([-2, -5, -45])
[-45, -5, -2]
"""# 輸入為空,就返回空列表
if collection ==
:return
coll_len =
len(collection)
coll_max =
max(collection)
#返回最大值
coll_min =
min(collection)
#返回最小值
#計算待排序列表的元素數值區域長度,如4-9共9+1-4=6個數
counting_arr_length = coll_max +
1- coll_min
counting_arr =[0
]* counting_arr_length #構造乙個全為0列表
for number in collection:
counting_arr[number - coll_min]+=1
#統計列表中每個值出現的次數,
#使counting_arr[i]存放<=i的元素個數,就是待排序列表中比某個值小的元素有多少個
for i in
range(1
, counting_arr_length)
: counting_arr[i]
= counting_arr[i]
+ counting_arr[i-1]
ordered =[0
]* coll_len #存放排序結果
#使每個元素被放在ordered中正確的位置,公升序
for i in
reversed
(range(0
, coll_len)):
#reversed表示從下標最大的位置到0,為了使排序穩定
ordered[counting_arr[collection[i]
- coll_min]-1
]= collection[i]
#-1是因為下標從0開始的
counting_arr[collection[i]
- coll_min]-=1
#每歸位乙個元素,就少乙個元素
return ordered
if __name__ ==
'__main__'
:try
:raw_input
# python 2
except nameerror:
raw_input
=input
# python 3
user_input =
raw_input
('輸入待排序的數,用\",\"分隔:\n'
).strip(
)#strip() 方法用於移除字串頭尾指定的字元(預設為空格)
unsorted =
[int
(item)
for item in user_input.split(
',')
]print
(counting_sort(unsorted)
)
穩定版計數排序
相比樸素版計數排序,可以保證排序後陣列中相等元素原本的先後順序不變。class solution 2.建立統計陣列並統計對應元素個數 int m maxval minval 1 vector int temp m for int i 0 i 3.統計陣列做變形,後面的元素等於前面的元素之和 int ...
計數排序與穩定排序
我們常用的排序演算法,有冒泡演算法 快速演算法等,它們都是基於元素之間的比較來進行排序,有一種特殊的演算法不是基於元素比較,而是利用陣列下標來確定元素在陣列的位置,這種演算法就是 計數排序 先來說一下實現的原理,假設有20個隨機整數的陣列array,他們值分別是 9,3,5,4,9,1,2,7,8,...
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 ...