归并排序也是采用分而治之的思想,也是一个效率比较高的算法,它通过将已有的有序子序列合并得到完全有序的序列,时间复杂度为O(NlogN)。JDK底层的排序算法中也用到了归并排序。
归并排序的主要步骤如下:
1.分解:将原序列在中间位置划分为两部分。
2.解决:对分解得到的两个子序列进行递归排序。
3.合并:将排好序的两个子序列进行合并,使合并后的序列有序。
关键在于第三步合并,这里需要创建一个新的数组保存合并后的数据,并且使用指针分别记录两个子序列当前位置,将指针指向的两个元素进行比较,将较小的元素拷贝到新创建的数组中,同时指向该元素的指针更新指向下一个位置,直到所有的数据都拷贝到了新数组中。
代码如下:
def merge_sort(array):
if len(array) <= 1:
return array
# 分解,将原始序列分成两部分
middle = int(len(array) / 2)
left = array[:middle]
right = array[middle:]
left_sort = merge_sort(left)
right_sort = merge_sort(right)
# 合并,将两个有序子序列合并成大的有序序列
result_array = []
i = j = 0
while i < len(left_sort) and j < len(right_sort):
if left_sort[i] <= right_sort[j]:
result_array.append(left_sort[i])
i += 1
else:
result_array.append(right_sort[j])
j += 1
result_array += left_sort[i:]
result_array += right_sort[j:]
return result_array
if __name__ == '__main__':
array = [5, 8, 7, 6, 5, 4, 0, 3, 2, 1, 9]
result = merge_sort(array)
print(result)
结果为:
[0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9]