第五課 其它型別排序演算法

2021-10-01 11:49:10 字數 4168 閱讀 8967

tags:

categories:

第二節 計數排序

第三節 桶排序

第四節 基數排序

希爾排序是之前插入排序的變形。

希爾排序(shell sort)是-種分組插入排序演算法。

首先取乙個整數d-=n/2, 將元素分為d個組,每組相鄰量元素之間距離為d,在各組內進行直接插入排序;

取第二個整數d2=d/2,重複上述分組排序過程,直到d=1,即所有元素在同- -組內進行直接插入排序。

希爾排序每趟並不使某些元素有序,而是使整體資料越來越接近有序;最後一趟排序使得所有資料有序。

# 希爾排序,只需要把插入排序拿過來。把出現的1 變為gap即可

definsert_sort_gap

(li, gap)

:for i in

range

(gap,

len(li)):

# i表示摸到的牌

temp = li[i]

j = i - gap # j表示有序區的最後一張牌(手裡的牌)

while j >=

0and li[j]

> temp:

li[j + gap]

= li[j]

j -= gap

li[j + gap]

= temp

defshell_sort

(li)

: d =

len(li)//2

while d >=1:

insert_sort_gap(li, d)

d //=

2import random

list

= random.sample(

[i for i in

range

(1000)]

,20)print

(list

)shell_sort(

list

)print

(list

)

希爾排序比插入排序表現好很多(實驗證明)

希爾排序表現比堆排序稍微慢一些(實驗證明)

希爾排序的時間複雜度討論比較複雜,並且和選取的gap序列有關。

自己查一下 維基百科。時間複雜度太多了

希爾排序平均情況下小於nn.現在得出最快的nlogn*logn

對列表進行排序,已知列表中的數範圍都在0到100之間。設計乙個時間複雜度為o(n)的演算法。

2

. 系統自帶的排序演算法:比我們之前學過的都快。因為底層是c語言寫的

# 計數排序 已知需要排序的列表元素範圍在0-100之間

defcount_sort

(li, max_count=

100)

: count =[0

for _ in

range

(max_count+1)

]for val in li:

count[val]+=1

li.clear(

)for ind, val in

enumerate

(count)

:for i in

range

(val)

:import random

list

=[random.randint(0,

100)

for i in

range

(1000)]

print

(list

)count_sort(

list

)print

(list

)

在計數排序中,如果元素的範圍比較大(比如在1倒億之間),如何改造演算法?

桶排序(bucket sort):首先將元素分在不同的桶中,在對每個桶中的元素排序。

然後在出數

# 桶排序

defbucket_sort

(li, n=

100, max_num=

10000):

# 建立桶列表, 桶也是乙個列表。所以應該是乙個二維列表

buckets =[[

]for _ in

range

(n)]

for val in li:

# 0-99 ->0, 100-199->1

# 10000->100 我們這只有0-99號桶。所以把10000放到99號桶

i =min(val //

(max_num // n)

, n-1)

# 放到i號桶中

buckets[i]

# 插入後先桶內排序

for j in

range

(len

(buckets[i])-

1,0,

-1):

# 桶內氣泡排序

if buckets[i]

[j]< buckets[i]

[j-1]:

buckets[i]

[j], buckets[i]

[j-1

]= buckets[i]

[j-1

], buckets[i]

[j]else

:break

# 輸出所有桶內元素

sorted_li =

for buc in buckets:

sorted_li.extend(buc)

return sorted_li

import random

list

=[random.randint(0,

10000

)for i in

range

(100)]

print

(list

)li = bucket_sort(

list

)print

(li)

桶排序的表現取決於資料的分布。也就是需要對不同資料排序時採取不同的分桶策略。

平均情況時間複雜度: o(n+k)

最壞情況時間複雜度: o(n^2*k)

空間複雜度: o(nk)

多關鍵字排序:加入現在有乙個員工表,要求按照薪資排序,年齡相同的員工按照年齡排序。

先按照年齡進行排序,再按照薪資進行穩定的排序。

對32,13,94,52,17,54,93排序, 是否可以看做多關鍵字排序? 先對個位排序,在對十位排序

裝多次桶,然後出數。桶排序是裝一次桶後,排序輸出。

# 基數排序演算法

defradix_sort

(li)

:# 迴圈次數即位數由最大值確定。

max_num =

max(li)

it =

0while

10** it <= max_num:

# 桶數確定的10個

buckets =[[

]for _ in

range(10

)]# 根據位數。個位十位百位..放入桶中

for val in li:

# 987 it=1 987//10->98 98%10->8; it=2 987//100->9 9%10=9

digit =

(val //(10

** it))%

10 buckets[digit]

# 分桶完成

li.clear(

)for buc in buckets:

# 重新寫回li

li.extend(buc)

it +=

1import random

list

=[random.randint(0,

1000

)for i in

range(20

)]print

(list

)radix_sort(

list

)print

(li)

時間複雜度: o(kn)

空間複雜度: 0(k+n)

k表示數字位數

有可能快排要快的(和數的範圍有關)

第五課 文法

1.名詞 場所 行 來 帰 使用移動動詞時,移動的方向用助詞 表示。京都 行 我要去京都。日本 來 我來到了日本。帰 我要回家。注 助詞 讀作 2.行 行 完全否定疑問詞所問的全部範疇時,用助詞 與否定形式一起使用。行 也不去。何 食 什麼也不吃。第6課 沒有任何人在。第10課 3.名詞 交通工具 ...

C語言第五課

主要內容 二維陣列 字串陣列 多維陣列 理解 一 二維陣列 有兩個下標的陣列稱為二維陣列 定義 型別修飾符 陣列名 常量表示式1 常量表示式2 第一維的長度 第二維的長度 示例 定義乙個2行3列的二維陣列 int array 2 3 這是乙個標準的二維陣列 二維陣列的元素也稱為雙下標變數 0 1 2...

C語言第五課

c函式若不宣告型別,則預設為 int 型 在函式中,指標可以 被調函式 修改 主調函式 1 int func int a main 2 void func int num main int num 2 func int b 野指標會 指向任一地方 int pum printf x pum 指標偏移的...