遞迴歸併排序的思想是把列表分為兩個子列表,單獨排序子列表在進行合併列表
遞迴法可以利用二叉樹進行理解,列表為根節點,子列表為子節點。
首先排序子列表,在一步步合併子列表,在合併兩個子列表。
"""
簡述歸併排序的方法: 【32, 43, 22, 1, 5, 33, 8, 9】
第一步: 將列表分開兩部分 32 43 22 1 5 33 8 9
第二步: 將左側列表進行拆分 32 43 22 1 5, 33 8, 9
第三步: 對比分開後的資料 進行初次排序 32 43 1 22 5 33 8 9
第四步: 取左側列表的乙個值 與右側的兩個值 分別對比 進行二次排序 1 22 32 43 5 8 9 33
第五步: 取第乙個列表中的值 與第二個進行一次對比 1 5 8 9 22 32 33 43 排序完成
"""def split_list(ali):
n = len(ali)
if n <= 1:
return ali
else:
num = n // 2
left = split_list(ali[:num])
right = split_list(ali[num:])
return merge_sort(left, right)
def merge_sort(left, right):
l, r = 0, 0
result =
while l < len(left) and r < len(right):
if left[l] < right[r]:
l += 1
else:
r += 1
result += left[l:]
result += right[r:]
return result
if __name__ == '__main__':
ali = [2, 3, 1, 4, 7, 6, 5, 3, 12]
print(split_list(ali))
迭代的思想是:將列表元素全部分開,然後在進行迭代合併
def split_list(ali):
# 將列表拆分成單個
n = len(ali)
num = 1
while num < n:
for i in range(0, n, num*2):
left = ali[i:i+num]
right = ali[i+num:i+num*2]
sort_li = merge_sort(left, right, i)
num *= 2
return sort_li
def merge_sort(left, right, i):
l, r = 0, 0
j = i # 列表新增的位置(下標)
while l < len(left) and r < len(right):
if left[l] < right[r]:
ali[j] = left[l]
l += 1
else:
ali[j] = right[r]
r += 1
j += 1
# 如果l到頭了 r沒到頭 r到頭了 l沒到頭
while l < len(left):
ali[j] = left[l]
l += 1
j += 1
while r < len(right):
ali[j] = right[r]
r += 1
j += 1
if __name__ == '__main__':
ali = [2, 3, 1, 4, 7, 6, 5, 3, 12]
print(split_list(ali))
print(ali)
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...
排序 歸併排序
利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...