zoukankan      html  css  js  c++  java
  • 归并排序(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在线解释器

  • 相关阅读:
    国内三大云数据库测试对比
    Nginx源码安装及调优配置
    如何在 CentOS 7 用 cPanel 配置 Nginx 反向代理
    开学了!这些Linux认证你要知道
    快速入门SaltStack
    WPF模板
    C#基础知识回顾-- 属性与字段
    程序员接私活经验谈[转]
    强烈推荐:240多个jQuery插件
    [Java]读取文件方法大全
  • 原文地址:https://www.cnblogs.com/bianjing/p/10260264.html
Copyright © 2011-2022 走看看