归并排序(python)

归并排序思想

  归并排序仍然是利用完全二叉树实现,它是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列。

  基本过程:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列,再两两归并,最终得到一个长度为n的有序序列为止,这称为2路归并排序。

图解:

  这个图非网络复制 完全博主根据代码执行顺序手工绘制。

  

代码:

# -*- coding:utf-8 -*-
# 归并
l = [1, 5, 8, 1, 2, 4, 5]

# 1.递归拆分
# 2.分组排序
# 3.重组排序

def merge(left, right):
    result = []
    i = j = 0
    while len(left) > i and len(right)>j:
        if left[i] > right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result.extend(left[i:])
    result.extend(right[j:])
    return result

def merge_sort(l):
    if len(l) <= 1:
        return l
    moddle = len(l)/2
    left = merge_sort(l[0: moddle])
    right = merge_sort(l[moddle: len(l)])
    print 'left:', left, 'right:', right
    return merge(left, right)

if __name__ == '__main__':
    a =  merge_sort(l)
    print a
    # def test(n):
    #     print '第一个n: %s' % n
    #     if n > 4:
    #         return
    #     test(n + 1)
    #     print '第二个n: %s' % n
    # test(1)

输出结果:

    

备注:如果不理解递归 先从递归入手,递归理解之后其余的就简单了,

  另外推荐一个很好用的分步骤在线解释器:http://www.pythontutor.com/ 完美的python在线解释器

原文地址:https://www.cnblogs.com/bianjing/p/10260264.html