当前位置: 首页 > news >正文

归并排序(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

相关文章:

  • C++学习札记(2011-10-06)
  • 蔚来汽车秦力洪:智能化与电动化天生融合,6大核心技术自主研发 | 电动汽车百人会 2019...
  • 杭电2090
  • Arcgis Runtime 100.3开发实例源代码调试日志
  • 上厅房,下厨房,ElasticSearch有的忙
  • Linux安装gitlab
  • 专家齐议尘肺病农民救助难点
  • Codeforces Round #532(Div. 2) A.Roman and Browser
  • 澳大利亚将开启全球人才计划 吸引优秀技术移民
  • kubernetes 设置CA双向数字证书认证
  • 澳门消防局拟购置无人机协助紧急救援
  • spring学习总结(一)_Ioc基础(下)
  • 联邦法官驳回章莹颖案被告所有动议 全案按原计划审理
  • MySQL逻辑架构及性能优化原理
  • mysql 查询的时候没有区分大小写的解决方案
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 78. Subsets
  • Asm.js的简单介绍
  • git 常用命令
  • gops —— Go 程序诊断分析工具
  • JavaScript DOM 10 - 滚动
  • JavaScript设计模式系列一:工厂模式
  • Java多态
  • jdbc就是这么简单
  • mysql innodb 索引使用指南
  • OSS Web直传 (文件图片)
  • python docx文档转html页面
  • Unix命令
  • 半理解系列--Promise的进化史
  • 如何合理的规划jvm性能调优
  • 如何在GitHub上创建个人博客
  • 入口文件开始,分析Vue源码实现
  • 山寨一个 Promise
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 阿里云API、SDK和CLI应用实践方案
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #数学建模# 线性规划问题的Matlab求解
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (三)mysql_MYSQL(三)
  • (算法)Game
  • (推荐)叮当——中文语音对话机器人
  • (一)kafka实战——kafka源码编译启动
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET命令行(CLI)常用命令
  • .NET值类型变量“活”在哪?
  • .net中我喜欢的两种验证码
  • .pop ----remove 删除
  • [100天算法】-不同路径 III(day 73)
  • [AIGC] MySQL存储引擎详解