數據結構:歸併排序算法,詳解,圖解 -- 數據結構算法集

歸併排序算法

歸併排序算法講的是先分後合:

總的來說歸併排序就是把原序列都拆分爲單個的元素,然後從單個的元素開始進行按照大小合併到中間list中,排序完成。

這裏的拆分比較容易,重點講解合併

合併的步驟:
  1. 首先創建一個用於存放排好序的列表result ,
  2. 然後比較兩個list中首元素的大小,
  3. 把較小的元素放到列表result中,並且在序列中刪除該元素,以防止影響後面判斷 ,
  4. 重複步驟2、3操作,直到有一個list爲空,
  5. 將剩下不爲空的list合併到列表result後面,
  6. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章