計數排序 python 穩定版排序

2021-08-22 07:23:01 字數 2210 閱讀 7502

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 ...