采用分治法:
分割:遞歸地把當前序列平均分割成兩半。
集成:在保持元素順序的同時將上一步得到的子序列集成到一起(歸並)。
歸並操作(歸並算法),指的是將兩個已經排序的序列合並成一個序列的操作。歸並排序算法依賴歸並操作。
遞歸法(Top-down)
1.申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合並后的序列
2.設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
3.比較兩個指針所指向的元素,選擇相對小的元素放入到合並空間,並移動指針到下一位置
4.重復步驟3直到某一指針到達序列尾
5.將另一序列剩下的所有元素直接復制到合並序列尾
迭代法(Bottom-up)
原理如下(假設序列共有 n個元素):
1.將序列每相鄰兩個數字進行歸並操作,形成 c e i l ( n / 2 ) 個序列,排序后每個序列包含兩/一個元素
2.若此時序列數不是1個則將上述序列再次歸並,形成 c e i l ( n / 4 )個序列,每個序列包含四/三個元素
3.重復步驟2,直到所有元素排序完畢,即序列數為1
下面為快速排序的代碼實現:
def merge_sort(lst): if len(lst) <= 1: # 當列表元素只有一個的時候,直接返回 return lst mid = len(lst) // 2 left = lst[:mid] right = lst[mid:] left = merge_sort(left) right = merge_sort(right) # 遞歸的進行排序 result = [] while left and right: if left[0] <= right[0]: result.append(left.pop(0)) else: result.append(right.pop(0)) if left: result += left if right: result += right return result # 返回排序后的結果 if __name__ == "__main__": li = [9, 4, 2, 3.6, -1, 0, 25, -34, 8, 9, 1, 0] print("排序前的隊列:",li) print("排序后的隊列:", merge_sort(li))
