1. 程式人生 > >排序演算法: 初級三大演算法思路與python程式碼演示

排序演算法: 初級三大演算法思路與python程式碼演示

三大初級演算法

  • 難度 ★
  • 演算法複雜度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)