归并排序
归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。
将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。
代码如下
def merge_sort(li):
# 列表长度小于等于1,直接返回列表
if len(li) <= 1:
return li
# 二分分解,设定中间坐标mid
mid_index = len(li) // 2
# 归并左列表
left_li = merge_sort(li[:mid_index])
# 归并右列表
right_li = merge_sort(li[mid_index:])
l_index = 0 # 左列表下标
r_index = 0 # 右列表下标
result = []
# 循环归并左右列表元素
while l_index < len(left_li) and r_index < len(right_li):
if left_li[l_index] <= right_li[r_index]:
result.append(left_li[l_index])
l_index += 1
else:
result.append(right_li[r_index])
r_index += 1
# 将左列表比较后剩余的元素加入列表
result += left_li[l_index:]
# print(result) # 测试效果
# 将右列表比较后剩余的元素加入列表
result += right_li[r_index:]
# print(result) # 测试效果
return result
if __name__ == '__main__':
li = [31, 42, 24, 56, 75, 51, 22, 65, 47, 87]
print(merge_sort(li))