首先我們讓我們了解一下什麼是桶排序
(這裡舉例子元素是在列表裡)
桶排序,顧名思義,這個排序和桶有千絲萬縷的關係,那為什麼不叫箱子排序,杯子排序等等呢?
我也不知道(開個玩笑》~<)
桶排序是計數排序的公升級版。它利用了函式的對映關係,按照我的理解就是把乙個個元素通過不斷的入桶,出桶從而達到對元素的排序的效果。
時間複雜度,在理想情況下的話是o(n),但是最壞的情況可能是o(mn),這個在下面的講解裡會提到。
空間複雜度,o(n)
廢話不多說,先上**
我大概解釋一下原理:def
bucket_sort
(lst,base)
: buckets=[[
]for i in
range
(base)
]#建立桶列表
max=
0for i in
range(1
,len
(lst)):
#找出最大的元素
if lst[i]
>lst[
max]
:max
=i max
=lst[
max]
m=1while m<=
max:
#這個條件很重要,是控制入桶,出桶的次數
for i in
range
(len
(lst)):
buckets[lst[i]
//m%base]
)#按照大小入桶
index=
0for i in
range
(base)
:#出桶
while
len(buckets[i]):
lst[index]
=buckets[i]
.pop(0)
index+=
1 m*=base#例如base=10,m=1*10
while
len(buckets)
: buckets.pop(
)del buckets
首先根據數字的進製(假設是10進製)建立對應的桶列表,列表裡面有10個桶從0~9對應下標排列,然後讀取元素列表,首先找出裡面最大的元素,然後根據最大元素的位數判斷入桶,出桶的次數。
ps:這裡解釋一下為什麼最壞的情況是o(mn),如果最大元素是1000000的話,那麼就要進行1000000次入桶,出桶的操作,這樣會非常麻煩,所以桶排序通常用於對於年齡的排序。
每次迴圈依次根據個位,十位,百位,千位。。。(假設是100就是迴圈3次,到百位停止)對元素進行入桶操作(對應的11入下標為1的桶)。
最後釋放桶列表,輸出排序後的元素列表。
後續的九大經典排序我會持續更新的
十大經典排序
每一次比較完就要立即交換 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。比較完所有...
十大經典排序演算法 桶排序演算法詳解
十大經典排序演算法1.概念 桶排序 bucket sort 是計數排序演算法的公升級版,將資料分到有限數量的桶子裡,然後每個桶再分別排序 2.演算法原理 這是乙個無序數列 11 38 8 34 27 19 26 13,我們要將它按從小到大排序 先建立5個桶,桶的區間跨度 最大值 最小值 桶的數量,注...
十大經典排序之氣泡排序
氣泡排序 氣泡排序 bubble sort 是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序 如從大到小 首字母從a到z 錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。這個演算法的名...