演算法導論第8章線性時間排序 Python實現

2021-10-06 10:03:16 字數 2239 閱讀 7107

計數排序

def

counting_sort

(a, b, k)

: c =[0

for i in

range

(k)]

length =

len(a)

for i in

range

(length)

: c[a[i]]+=

1for i in

range(1

, k)

: c[i]

= c[i]

+ c[i-1]

for i in

range

(k):

c[i]-=1

for i in

range

(length -1,

-1,-

1): b[c[a[i]]]

= a[i]

c[a[i]]-=

1a =[2

,5,3

,0,2

,3,0

,3]b =[0

for i in

range

(len

(a))

]k =

6counting_sort(a, b, k)

print

(b)

基數排序

def

radixsort

(nums)

: mod =

10 div =

1 mostbit =

len(

str(

max(nums)))

# 最大數的位數決定了外迴圈多少次

buckets =[[

]for row in

range

(mod)

]# 構造 mod 個空桶

while mostbit:

for num in nums:

# 將資料放入對應的桶中

buckets[num // div % mod]

i =0# nums 的索引

for bucket in buckets:

# 將資料收集起來

while bucket:

nums[i]

= bucket.pop(0)

# 依次取出

i +=

1 div *=

10 mostbit -=

1return nums

nums = radixsort(

[329

,457

,657

,839

,436

,720

,355])

print

(nums)

桶排序

def

radixsort

(nums)

: mod =

10 div =

1 mostbit =

len(

str(

max(nums)))

# 最大數的位數決定了外迴圈多少次

buckets =[[

]for row in

range

(mod)

]# 構造 mod 個空桶

while mostbit:

for num in nums:

# 將資料放入對應的桶中

buckets[num // div % mod]

i =0# nums 的索引

for bucket in buckets:

# 將資料收集起來

while bucket:

nums[i]

= bucket.pop(0)

# 依次取出

i +=

1 div *=

10 mostbit -=

1return nums

nums = radixsort(

[329

,457

,657

,839

,436

,720

,355])

print

(nums)

演算法導論 第8章 線性時間排序

比較排序指在排序的最終結果各元素的次序依賴於它們之間的比較的排序演算法。在最壞情況下,任何比較排序演算法都需要做 nlgn 次比較。因此堆排序和歸併排序都是漸近最優的比較排序演算法。本章討論三種用運算而不是比較來確定排序順序的線性時間複雜度的排序演算法 計數排序假設n個輸入元素中的每乙個都是在0 k...

演算法導論 第8章 線性時間排序 計數排序

計數排序 n個元素都是0到k範圍得整數,當k o n 時,排序執行時間為o n 思想 對於數x,確定小於x的個數m,將x放在第m 1個位置上 例子 假設3個元素小於x,那麼x應該放在4上 輸入第一行的第乙個數n是陣列的個數,第一行第二個數表示所有n的元素中最大的數k 接下來的第二行就是n個數字 輸入...

《演算法導論》第8章 線性時間排序 1 計數排序

一種簡單的實現是得到陣列c,c i 表示陣列a中值為i的元素個數。c 就表示兩個0,兩個2,三個3,乙個5。然後將這些數字依次存到陣列b中。include include void printarray int,int void counting sort int a,int b,int len,i...