1 #!/usr/bin/env python3 2 3 def merge(ary): 4 if len(ary) == 1: return ary 5 num = len(ary) // 2 6 arya = merge(ary[:num]) 7 aryb = merge(ary[num:]) 8 return merge_sort(arya, aryb) 9 10 def merge_sort(arya, aryb): 11 indexa, indexb = 0, 0 12 li = [] 13 while indexa < len(arya) and indexb < len(aryb): 14 if arya[indexa] <= aryb[indexb]: 15 li.append(arya[indexa]) 16 indexa += 1 17 else: 18 li.append(aryb[indexb]) 19 indexb += 1 20 li = li + arya[indexa:] + aryb[indexb:] 21 return li 22 23 if __name__ == '__main__': 24 ary = [2,1,4,7,8,3,4,7,9,10,5,2,4,7] 25 print(merge(ary))
merge_sort就如上一篇博客写的一样,可以对两个有序数组进行合并。算法复杂度为0(n)
现在给定了一个无序数组,可以使用分治的方法对其进行处理。分治即分而治理的意思。
所以这里将 ary 这个大数组从中间平分为两个小数组 arya 和 aryb 。
然后 在分别对 arya 实行分治 和对 aryb 实行分治。
直到 arya 或 aryb 中的元素只有一个才结束。 (单个元素是已经排好序的) 其实这也是递归的思想,必须要有递归的终点,即基本情况。单个元素就是基本情况。
这个merge函数的算法复杂度为0(lgn)
所以归并排序的算法复杂度为0(nlgn)
参考:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/
感谢原文作者