演算法基礎篇 線性時間非比較排序演算法

2021-10-04 08:52:38 字數 3804 閱讀 7363

: 關於非線性時間得比較排序演算法請看我得另一篇部落格

主要思想:獲取待排序陣列得最大值和最小值,然後開闢乙個從最小值到最大值得連續的陣列,該陣列陣列頭是最小值,陣列尾是最大值。根據陣列中數字相對於最小值最大值的大小儲存在相應得位置。所以該演算法適合進行整數得排序,有理數排序不太適用。

def

countsort

(sortlist)

: result =

iflen

(sortlist)==0

:print

("輸入陣列為空"

)pass

else

:##找最大值最小值

maxnum=sortlist[0]

minnum=sortlist[0]

for item in sortlist:

if item>maxnum:

maxnum=item

if itemminnum=item

##接下來開闢計數陣列

numlist=[[

]for i in

range

(maxnum-minnum+1)

]for item in sortlist:

numlist[item-minnum]

for ilist in numlist:

for j in ilist:

return result

sortlist=[9

,1,3

,5,8

,3,2

,9,4

]print

(countsort(sortlist)

)

主要思想:工作的原理是將陣列分到有限數量的桶子裡。每個桶子再分別排序(有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序)。桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間(θ(n)),但桶排序並不是 比較排序,他不受到 o(n log n) 下限的影響。桶排序是計數排序的乙個優化,因為計數排序的過程中如果這個數列中最大值與最小值的跨度比較大的化,很容易產生乙個佔位很大的中間陣列,為了解決這個問題,可以人為的確定中間陣列的大小,然後在每個小數桶內進行排序。(下面得**每個小桶內通過計數排序進行再排序)

def

bocketsort

(list

,bocketsize)

:#傳入兩個引數,待分配陣列和桶的大小

maxnum =

list[0

] minnum =

list[0

]for item in

list

:if item > maxnum:

maxnum = item

if item < minnum:

minnum = item

bocketlist=[[

]for i in bocketsize]

evebocketsize=

(maxnum-minnum+1)

/bocketsize

for item in

list

: bocketlist[

(item-minnum)

//bocketsize]

result=

for evlist in bocketlist:

result+=countsort(evlist)

return result

defcountsort

(sortlist)

:##計數排序

result =

iflen

(sortlist)==0

:print

("輸入陣列為空"

)pass

else

:##找最大值最小值

maxnum=sortlist[0]

minnum=sortlist[0]

for item in sortlist:

if item>maxnum:

maxnum=item

if itemminnum=item

##接下來開闢計數陣列

numlist=[[

]for i in

range

(maxnum-minnum+1)

]for item in sortlist:

numlist[item-minnum]

for ilist in numlist:

for j in ilist:

return result

sortlist=[9

,1,3

,5,8

,3,2

,9,4

]print

(bocketsort(sortlist,5)

)

主要思想:(低位到高位的排序方法)先通過個位進行排序,然後通過10位進行排序,依次往上推,當最高位排完以後整個佇列實現有序。

對於陣列[19,12,53,75,38,73,27,49,46,81,193,76,98,34,51,23,46],應用基數排序過程如下:

根據個位排序

[81, 51, 12, 53, 73, 193, 23, 34, 75, 46, 76, 46, 27, 38, 98, 19, 49]

將上面陣列根據十位排序,這樣就保證了10位相同的個位小的在前面。

[12, 19, 23, 27, 34, 38, 46, 46, 49, 51, 53, 73, 75, 76, 81, 193, 98]

最後根據百位排序

[12, 19, 23, 27, 34, 38, 46, 46, 49, 51, 53, 73, 75, 76, 81, 98, 193]

##從低位到高位排序

defradixsort

(sortlist)

: bit=

1#1表示個位

while

true

: quit=

true

countlist =[[

]for i in

range(10

)]#for item in sortlist:

##先得個位,逐次往高位

try:

countlist[

int(

str(item)

[-bit])]

quit =

false

except

: countlist[0]

if quit:

##說明不需要再繼續迴圈了,所有得資料作再countlist[0]裡面

break

else

: sortlist=

for lst in countlist:

for j in lst:

bit +=

1print

(sortlist)

return countlist[0]

sortlist=[19

,12,53

,75,38

,73,27

,49,46

,81,193,76

,98,34

,51,23

,46]print

("基數排序得結果如下:"

)print

(radixsort(sortlist)

)

常用排序演算法總結(2) 非比較排序演算法

主要有氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等。在一定條件下,它們的時間複雜度可以達到o n 需要三個陣列 待排序陣列 int arr new int 輔助計數陣列 int help new int max min 1 該陣列大小為待排序陣列中的最大值減最小值 1 輸出陣列 int...

排序演算法總結2一非比較排序

目錄 一.計數排序 countingsort 二.基數排序 radixsort 二.桶排序 bucketsort 這篇文章中我們來 一下常用的非比較排序演算法 計數排序,基數排序,桶排序。在一定條件下,它們的時間複雜度可以達到o n 這裡我們用到的唯一資料結構就是陣列,當然我們也可以利用鍊錶來實現下...

C 演算法之桶排序 非比較排序之二

劃重點 求最值,初新組,正反填充陣列得 桶排序是計數排序的公升級版。它利用了函式的對映關係,高效與否的關鍵就在於這個對映函式的確定。其過程與計數排序一致,也是進行 求最值,初新組,正填充,反填充 的操作。不一樣的在於,桶排序需要遞迴呼叫來對桶內的陣列進行排序。步驟0 人為設定乙個bucketsize...