递归归并排序的思想是把列表分为两个子列表,单独排序子列表在进行合并列表
递归法可以利用二叉树进行理解,列表为根节点,子列表为子节点。
首先排序子列表,在一步步合并子列表,在合并两个子列表。
"""
简述归并排序的方法: 【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]:
result.append(left[l])
l += 1
else:
result.append(right[r])
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)