排序演算法總結(python實現)
阿新 • • 發佈:2021-02-07
技術標籤:演算法
排序演算法總結
氣泡排序
氣泡排序可能是大家在大學計算機課程中接觸的第一個排序演算法,雖然其複雜度相對較高,但其中著眼於一點的問題解決方式是值得我們學習和借鑑的,當然我們可以先排最後一個位置的數,也可以先排最初始位置的數,其在程式設計上沒有本質的區別,下面展示最典型的兩種排法:
#先排最後的位置
def bub_sort(seq: list) -> list:
for j in range(len(seq)-1,0,-1):
for i in range(j):
if seq[i] > seq[i+1]:
seq[i],seq[i+1] = seq[i+1], seq[i]
return seq
#先排初始的位置
def bub_sort(seq: list) -> list:
for i in range(len(seq)):
for j in range(len(seq)-1, i, -1):
if seq[j] < seq[j-1]:
seq[j], seq[j-1] = seq[j-1], seq[j]
return seq
其遞迴的寫法也就是把最外面一層迴圈換成遞迴的形式
插入排序
這個排序方式也是比較簡單的,當然對於插入,我們也有二分插入,遍歷插入等不同的方式
迴圈版本
def ins_sort(seq: list) -> list:
for i in range(1,len(seq)):
j = i
while j > 0 and seq[j-1] > seq[j]:
seq[j-1], seq[j] = seq[j], seq[j-1]
j -= 1
return seq
遞迴版本
def ins_sort(seq: list, i: int) -> list:
if i == 0:
return
ins_sort(seq,i-1)
j = i
while j > 0 and seq[ j-1] > seq[j]:
seq[j-1], seq[j] = seq[j], seq[j-1]
j -= 1
return seq
最大值查詢
查詢的方法,當然還有最大值查詢,方法很簡單,我們只需要查詢最大值然後交換就可以了
#迴圈版
def ins_sort(seq: list) -> list:
for i in range(len(seq)-1,0,-1):
max_val = i
for j in range(i):
if seq[max_val] < seq[j]:
max_val = j
seq[i], seq[max_val] = seq[max_val], seq[i]
return seq
#遞迴版
def ins_sort(seq: list, num: int) -> list:
if num == 0:
return
max_val = num
for j in range(max_val):
if seq[max_val] < seq[j]:
max_val = j
seq[num], seq[max_val] = seq[max_val], seq[num]
ins_sort_1(seq, num-1)
return seq
二分插入
我們現在是對插入方式進行優化,但二分插入還有許多其他的用處,比如說,我們通過二分插入去找一個有序序列插入時的索引等
def div(seq: list, end_num: int, num) -> list:
sta_num = 0
while sta_num <= end_num:
mid = (sta_num + end_num) // 2
if seq[mid] <= num:
sta_num = mid + 1
else:
end_num = mid - 1
seq.insert(sta_num, num)
def ins_sort(seq: list) -> list:
for i in range(1,len(seq)):
seq.pop(i)
div(seq, i-1, i)
return seq
這樣進行排序的時候,結果沒有什麼大問題,但其實我們還可以再優化一下,因為進行一次pop和insert列表的儲存位置都會發生變化,並且,這種變化是不必要的,其實我們可以用連結串列的資料結構進行優化,但連結串列的缺點也很明顯,就是無法方便的訪問資料。