歸併排序算法
歸併排序算法講的是先分後合:
總的來說歸併排序就是把原序列都拆分爲單個的元素,然後從單個的元素開始進行按照大小合併到中間list中,排序完成。
這裏的拆分比較容易,重點講解合併
合併的步驟:
- 首先創建一個用於存放排好序的列表result ,
- 然後比較兩個list中首元素的大小,
- 把較小的元素放到列表result中,並且在序列中刪除該元素,以防止影響後面判斷 ,
- 重複步驟2、3操作,直到有一個list爲空,
- 將剩下不爲空的list合併到列表result後面,
- result就是合併、排序後的列表。
圖解
代碼實現
# _*_ encoding:utf-8_*_
# 主函數,拆分
def merger_sort(lists):
mid = len(lists) // 2 # 取中間元素下標
if mid < 1: # 說明元素只剩一個,無法拆分
return lists
left_list = lists[:mid] # 把lists分爲兩部分
right_list = lists[mid:]
left = merger_sort(left_list) # 再拆分
right = merger_sort(right_list)
return merger(left,right) # 合併
# 合併
def merger(left,right):
result = [] # 存放合併排序後的元素
# 這裏是進行比對兩個list中的數據,按照大小放入到公共list中
# 兩個list需要同時不爲空才能比較兩者中的數據,
# 每次把元素存放到中間list,都需要把原list中的元素剔除,用pop很合適
while left and right:
# 把較小的數據彈出放到result中
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
# 把比較剩餘的元素放入到公共list末尾,
# 比較剩餘的元素肯定是排列好順序的,並且是較大的值,
# 這裏left和right肯定有一個爲空,所以就放到一起合併list
return result + left + right
lt = [3,55,1,6,11,7,4]
print merger_sort(lt)
結果:
文章中有不足之處請多多指教,歡迎討論,共同學習,共同進步
參考:
https://www.runoob.com/w3cnote/merge-sort.html