排序演算法: 初級三大演算法思路與python程式碼演示
阿新 • • 發佈:2018-12-04
三大初級演算法
- 難度 ★
- 演算法複雜度O(n2)
氣泡排序 ★
Bubble Sort
演算法複雜度: O(n2)
思路
趟數從0開始算每一趟,列表相鄰兩前面比後面大則交換位置, 每一趟無序的少一個,有序的多一個數
優化: 如果一趟沒有一個交換位置,那麼這一趟之後就完成了
def bubble_sort(li):
for i in range(len(li) - 1): # 第i趟
exchange = False
for j in range(len(li) - i - 1): # 箭頭移動
if li[j] > li[j + 1]:
li[j], li[j + 1] = li[j + 1], li[j] # 交換位置
exchange = True
print(li)
if not exchange:
return
li_test = [3, 2, 7, 1, 6, 9, 8, 4]
bubble_sort(li_test)
選擇排序 ★
Select Sort
演算法複雜度: O(n2)
思路
每趟找最小的一個,放列表的最前面有序區
缺點: 多生成了一個列表多佔了記憶體空間!
def select_sort(li):
for i in range(len(li)-1): # i是第幾趟
min_loc = i # 最小的排到位置
for j in range(i+1, len(li)):
if li[j] < li[min_loc]:
min_loc = j
li[i], li[min_loc] = li[min_loc] , li[i] # 交換位置
print(li)
li_test = [3, 5, 7, 1, 6, 9, 8, 4]
select_sort(li_test)
插入排序 ★
Insert Sort
演算法複雜度: O(n2)
思路
類似玩撲克,每次從無序區摸一張,插到手裡的有序區
def insert_sort(li):
for i in range(1, len(li)): # i表示摸到牌的下標
tmp = li[i]
j = i - 1 # j為手裡的牌下標
# 如果j比摸到的牌大,就挪動
while j >= 0 and li[j] > tmp:
li[j+1] = li[j]
j -= 1
li[j+1] = tmp # 每次移動
print(li)
li_test = [3, 5, 7, 1, 6, 9, 8, 4]
insert_sort(li_test)