归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。
#!/usr/bin/python
# coding=utf-8
def merge_sort(a_list):
"""归并排序"""
n = len(a_list)
if 1 == n:
return a_list
# 定义一个基准, 用于分解数组
mid = n // 2
# 对左半部分进行归并排序
left_sorted_li = merge_sort(a_list[:mid])
# 对有半部分进行递归并排序
right_sorted_li = merge_sort(a_list[mid:])
# 合并两个有序集合
left, right = 0, 0
merge_sorted_li = []
left_n = len(left_sorted_li)
right_n = len(right_sorted_li)
while left < left_n and right < right_n:
if left_sorted_li[left] <= right_sorted_li[right]:
merge_sorted_li.append(left_sorted_li[left])
left += 1
else:
merge_sorted_li.append(right_sorted_li[right])
right += 1
merge_sorted_li += left_sorted_li[left:]
merge_sorted_li += right_sorted_li[right:]
return merge_sorted_li
if __name__ == '__main__':
a_list = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(a_list)
sorted_list = merge_sort(a_list)
print(sorted_list)
# 输出结果
排序前: [54, 26, 93, 17, 77, 31, 44, 55, 20]
排序后: [17, 20, 26, 31, 44, 54, 55, 77, 93]