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 指標偏移的...