1. 程式人生 > >常用排序演算法的Python實現

常用排序演算法的Python實現

1、氣泡排序

def bubble_sort(L):
    _len = len(L)
    for i in range(_len-1, -1, -1):   #索引i遞減
        for j in range(i):   #索引j遞增
            if L[j] > L[j+1]:   #若比下一個元素大,交換
                L[j], L[j+1] = L[j+1], L[j]
    return L

2、快速排序

def quick_sort(L):
    if len(L) < 2:  #當序列中只有1個元素時,返回
        return L
    base = L[0]   #取序列的第一個元素作base
    left = [ i for i in L[1:] if i < base ]  #小於base的進left序列
    right = [ i for i in L[1:] if i > base ] #小於base的進right序列
    return quick_sort(left) + [base] +quick_sort(right) #歸併左右序列

3、插入排序

def insert_sort(L):
    _len = len(L)
    for i in range(1, _len): #從第2個元素開始
        for j in range(i):  #L[i]與它左側的元素逐一比較,保證均比自己小
            if L[i] < L[j]:  #當遇到大於自己的元素
                L.insert(j, L[i])  #插入該位置
                L.pop(i+1)  #將原位置元素刪除
    return L

4、選擇排序

def select_sort(L):
    _len = len(L)
    for i in range(_len):  #索引i遞增
        min_index = i   #最小元素的索引
        for j in range(i+1, _len):  #在i+1~_len間找最小元素
            if L[j] < L[min_index]:  
                min_index = j  #更新最小元素索引
        L[i], L[min_index] = L[min_index], L[i]  #將最小元素放到當前範圍最左
    return L

5、歸併排序

def merge(left, right):  #組合子序列
    result = []  #結果序列
    while left and right:
        if left[0] >= right[0]:  #按由小到大在result中排序
            result.append(right.pop(0))
        else:
            result.append(left.pop(0))
    result.extend(left)
    result.extend(right)    
    return result

def merge_sort(L):
    if len(L) < 2:  #序列中元素為1,返回
        return L
    mid = len(L) // 2   #將序列一分為二
    left = merge_sort(L[:mid])  #遞迴拆解子序列
    right = merge_sort(L[mid:])
    return merge(left, right)  #呼叫merge組合子序列