你的分享就是我们的动力 ---﹥

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

时间:2013-02-28 10:55来源:www.chengxuyuans.com 点击:
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

最差时间复杂度:O(nlogn)
最优时间复杂度:O(n)
平均时间复杂度:O(nlogn)


归并操作归并操作(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

转载注明地址:http://www.chengxuyuans.com/Python/49450.html

推荐文章