算法: 归并排序

 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/

感谢原文作者

posted @ 2017-02-21 03:04  小黄人python  阅读(182)  评论(0编辑  收藏  举报