排序 歸併排序

2021-09-24 01:19:12 字數 2061 閱讀 6958

遞迴歸併排序的思想是把列表分為兩個子列表,單獨排序子列表在進行合併列表

遞迴法可以利用二叉樹進行理解,列表為根節點,子列表為子節點。

首先排序子列表,在一步步合併子列表,在合併兩個子列表。

"""

簡述歸併排序的方法: 【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例程...