排序算法学习(python版本)之归并排序(MergeSort)

[b]归并排序[/b](Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

[table]
|最差时间复杂度:O(nlogn) |
|最优时间复杂度:O(n)|
|平均时间复杂度:O(nlogn)|
[/table]

归并操作归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
[编辑]算法描述归并操作的过程如下:

1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4. 重复步骤3直到某一指针达到序列尾
5. 将另一序列剩下的所有元素直接复制到合并序列尾

归并排序具体工作原理如下(假设序列共有n个元素):

1. 将序列每相邻两个数字进行归并操作,形成个序列,排序后每个序列包含两个元素
2. 将上述序列再次归并,形成个序列,每个序列包含四个元素
3. 重复步骤2,直到所有元素排序完毕

代码:
示例一

#!/usr/bin/env python
#-*-encoding:utf-8-*-

def merge_sort(lst):
if(len(lst) <= 1): return lst
left = merge_sort(lst[:len(lst)/2])
right = merge_sort(lst[len(lst)/2:len(lst)])
result = []
while len(left) > 0 and len(right)> 0:
if( left[0] > right[0]):
result.append(right.pop(0))
else:
result.append(left.pop(0))

if(len(left)>0): result.extend(merge_sort(left))
else: result.extend(merge_sort(right))
return result

def main():
L = [22,11,55,33,66]
print merge_sort(L)

if __name__=="__main__":
main()

示例二

#!/usr/bin/env python
#-*-encoding:utf-8-*-

def merge_sort(List):
mid=int(len(List)/2)
if len(List)<=1:return List
return merge(merge_sort(List[:mid]),merge_sort(List[mid:]))

def merge(l1,l2):
final=[]
l1 = sorted(l1)
l2 = sorted(l2)
while l1 and l2:
if l1[0]<=l2[0]:
final.append(l1.pop(0))
else:
final.append(l2.pop(0))
return final+l1+l2

def main():
L = [22,11,55,33,66]
print merge_sort(L)

if __name__=="__main__":
main()


参考资料:
http://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F

你可能感兴趣的:(python,algorithm,sort)