排序演算法Python

2021-08-15 02:34:40 字數 2211 閱讀 8617

廢話不說直接看

'''

計數排序

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