廢話不說直接看
'''
計數排序
'''def
countsort
(datalist):
#最終排好序的陣列
b=[0]*len(datalist)
#計算用來儲存計數的陣列c的長度
maxnum=max(datalist)
minnum=min(datalist)
clength=maxnum-minnum+1
c=[0]*clength
#將原陣列中數字出現的次數儲存到c中
for i in range(len(datalist)):
#datalist[i]-min表示datalist中下標為i的值應該放到c中哪個位置去
c[datalist[i]-minnum]+=1
#將c中陣列元素的值(每個值出現的次數)加上前乙個數字出現的次數
for i in range(1,clength):
c[i]+=c[i-1]
#遍歷a中元素,將它放入b中最終應該在的位置
for i in range(len(datalist)):
#c[datalist[i]-minnum]表示截止datalist[i],小於等於datalist[i]的有多少
b[c[datalist[i]-minnum]-1]=datalist[i]
#c中記錄的值得數量應該減1,因為那個對應的元素已經到b裡面了
c[datalist[i]-minnum]-=1
return b
基數排序理解起來也是比較容易的,不過不要被「基數」這個名詞給整蒙了,說白了,基數排序就是先將個位相同的放到乙個桶裡面(此時共有10個桶,分為0,1,2,3,4,5,6,7,8,9,放進桶裡的都是有序的,因為拿出來的時候回先從標號為0的桶開始拿,),桶清空,然後把十位相同的放進乙個桶裡面,以此類推,最終得到有序的序列。
直接先來個簡單的例子,假設我們要排序的陣列為: a=[10 , 23, 56 ,78 ,42 ,12, 58 , 46 ,1 ,4 , 65 ]
第一次放進桶裡面的是個位相同的,也就是:
第二次放進桶裡面的十位數相同,也就是:
(1,4的十位數都是0)
那麼將上述陣列小段合併起來組成的陣列就是有序的了。
但是現在有一些細節問題需要解決:
q:怎麼知道最大的數字是多少位的呢?
k = int(math.ceil(math.log(max(a)+1, radix))) # 最大的數用幾位數表示,如91用兩位數表示
其中radix表示進製,預設就是採用10進製表達radix=10
得到k表示=2表示用個位和十位可以表示所有的數,即不超過三位數
q:怎麼知道個位數十位數是多少呢?
temp=int(val%(radix**i)/(radix**(i-1)))
其中i就是上面k的遍歷,算個位是多少就令i=1
乙個簡單的例子:
import math
"""a為整數列表, radix為基數"""
a=[10,23,56,78,42,12,58,46,1,4,65]
radix=10
k = int(math.ceil(math.log(max(a)+1, radix))) # 最大的數用幾位數表示,如91用兩位數表示
bucket = [ for i in range(radix)] # 不能用 *radix
bucketback = #桶的快取,便於觀察桶中元素的變化
for i in range(1, k+1): # k次迴圈,如兩次迴圈的話,先將個位排序,在排序10位數
for val in a:
temp=int(val%(radix**i)/(radix**(i-1)))
print(temp,end=' ')
print()
del a[:]
for each in bucket:
a.extend(each) # 桶合併,第一次合併後個位有序,然後十位有序····
bucket = [ for i in range(radix)]#清空當前桶,便於下一次入桶
但上面的**有乙個bug,就是沒法排序負數,那怎麼辦呢?
一種方法就是先把負數和正數分開,分別排序後合併,這種思路的實現**在文章末尾。
排序演算法 python
author xcy 參考別人,盡量自己寫了 命名規則不太好,不建議用list命名,但不好改了。寫的過程中遇到的問題都寫在注釋中 以下方法都在pycharm中除錯過,python3.7,但測試用例不多,難免有錯誤望批評指正 剛發現shell排序 有問題,網上的部落格都是照搬的啊,錯的也搬。還有歸併和...
Python 排序演算法
python 排序演算法 持續更新ing 內建排序 氣泡排序 0 n 2 插入排序 選擇排序 希爾排序 堆排排序 快排排序 歸併排序 呼叫方法預設排序 a 9,5,8,7,4,3,1,6,2,0 a.sort print a 呼叫方法預設排序 a 9,5,8,7,4,3,1,6,2,0 b sort...
Python 排序演算法
lst 4,3,6,9,2,1 1 氣泡排序 依次把最大的數字往後移動 def bubble sort lst for i in range len lst 1 for j in range len lst 1 i if lst j 1 lst j lst j 1 lst j lst j lst j...