想更好的了解归并排序, 需先了解, 将两个有序列表, 组成一个有序列表

有两个列表  l1 = [1, 3, 5, 7]

l2 = [2, 4, 6]

需要将 l1 和 l2 组成一个 有序大列表  l = [1, 2, 3, 4, 5, 6, 7]

注意,前提 l1 和 l2 两个列表已经排好序, 是有序列表

 def merge(l1, l2):
# 两个列表, 两个初始索引号, 赋值 0
l1_index, l2_index = 0, 0
# 存放结果的新的空列表
result = []
# 循环, 两个索引值都要小于各自列表的长度
while l1_index < len(l1) and l2_index < len(l2):
# 小的数值,则添加到结果列表中, 并把小列表 的索引+1,
# 这样 小列表就指向下一个数据, 和 另一个列表的的数值再次比较
if l1[l1_index] < l2[l2_index]:
result.append(l1[l1_index])
l1_index += 1
else:
result.append(l2[l2_index])
l2_index += 1 # l1 和 l2 长度可能相等, 也可能不等
# 但是经过while循环后, l1_index 和 l2_index
# 最少有一个,已经到列表的末尾
# 所以,如下对两个列表的最后切片取值,
# 最少有一个是空列表,
# 直接列表相加, 就省去了判断代码逻辑
result += l1[l1_index:]
result += l2[l2_index:]
return result print(merge([1, 3, 5, 7], [2, 4, 6]))

归并排序的递归算法实现,

直接使用了上面代码的合并 merge 函数

 def mergesort(lists):
# 如果列表长度小于等于1
# 说明列表是空列表, 或只有一个元组
# 则不需要排序,直接返回原列表
if len(lists) <= 1:
return lists
# 列表长度除以2
num = int(len(lists) / 2)
# 将列表一分为二,
# 再分别对这两个列表进行归并排序
left = mergesort(lists[:num])
right = mergesort(lists[num:])
# 注意,这是递归算法
# left 和 right 变成只有一个元素的列表值的时候
# 或者, left 和 right 都已是有序列表
# 调用merge函数
# 可以打印, left 和 right 的值看看,
# 感受, left 和 right 的变化
# print(left, right)
return merge(left, right) print(mergesort([3, 1, 4]))
print(mergesort([3, 1, 4, 2]))

归并排序,  将一个列表 一分为二, 分别对两个新列表进行归并排序, 然后 将这 两个排序后的新列表 进行 合并.

两个被拆分的  新列表 再次进行归并排序, 直至递归到只有一个元素的情况,

最后, 由最后的两个元素, 开始 合并, 逐层 向上 合并, 实现全部排序

痛点: 是对递归算法的了解

归并排序之python的更多相关文章

  1. 归并排序(Python实现)

    目录 1. 归并排序--while版本 2. 测试用例 3. 算法时间复杂度分析 1. 归并排序--while版本 def merge_sort_while(b_list): '''归并排序--whi ...

  2. 排序算法之归并排序的python实现

    采用分治法: 分割:递归地把当前序列平均分割成两半. 集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并). 归并操作(归并算法),指的是将两个已经排序的序列合并成一个序列的操作.归并排序 ...

  3. 归并排序算法-python实现

    #-*- coding: UTF-8 -*- import numpy as np def Merge(a, f, m, l): i = f j = m + 1 tmp = [] while i &l ...

  4. python数据结构与算法——归并排序

    归并排序: 原理与C语言实现 参考:白话经典算法系列之五 归并排序的实现 1. 容易对有序数组A,B进行排序. 2. 为了使得A,B组内数据有序:可以将A,B组各自再分成二组. 3. 经过不断分组,当 ...

  5. 你需要知道的九大排序算法【Python实现】之归并排序

    四.归并排序 基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.归并过程:比 ...

  6. JavaScript算法 ,Python算法,Go算法,java算法,系列之【归并排序】篇

    常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的 ...

  7. python实现折半查找算法&&归并排序算法

    今天依旧是学算法,前几天在搞bbs项目,界面也很丑,评论功能好像也有BUG.现在不搞了,得学下算法和数据结构,笔试过不了,连面试的机会都没有…… 今天学了折半查找算法,折半查找是蛮简单的,但是归并排序 ...

  8. python实现归并排序,归并排序的详细分析。

    学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚的 ...

  9. 高速排序,归并排序,堆排序python实现

    高速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*l ...

随机推荐

  1. 【Java基础】While循环详解

    循环结构分两大类,一类是当型,一类是直到型. 当型: 当布尔值表达式条件为True时,反复执行某语句,当布尔表达式的值为False时才停止循环,例如:while 与 for循环. 直到型: 先执行某语 ...

  2. 学习Flask框架

      # -*- encoding: utf-8 -*- #导包 from flask import Flask #建立flask对象 app = Flask(__name__) #使用flask路由器 ...

  3. 关于Float.parseFloat()的一点探讨

    最近在解决线上的bug时,遇到一个问题. 第三方传过来的课程编码时4214410000,然而我们存进数据库的值却变成了4214409980.查遍了所有的代码都查不到有对这个值修改的代码.最后,通过打印 ...

  4. stm32 HAL库笔记(零)

    最近在设计四旋翼飞行器,用stm32f407,有三种开发方式可以选择:一.寄存器开发.二:库函数开发.三:HAL库开发,考虑了一下,选择了HAL库,原因如下: 1. 寄存器开发相对较慢,寄存器很多,配 ...

  5. java高并发实战(一)——为什么需要并发

    转自:https://blog.csdn.net/gududedabai/article/details/80813592

  6. 深度学习原理与框架- tf.nn.conv2d_transpose(反卷积操作) tf.nn.conv2d_transpose(进行反卷积操作) 对于stride的理解存在问题?

    反卷积操作: 首先对需要进行维度扩张的feature_map 进行补零操作,然后使用3*3的卷积核,进行卷积操作,使得其维度进行扩张,图中可以看出,2*2的feature经过卷积变成了4*4.    ...

  7. maven source 1.3 中不支持泛型 解决办法

    maven打包时始终出现以下提示:1.-source 1.3 中不支持泛型(请使用 -source 5 或更高版本以启用泛型)List<User> userList= new ArrayL ...

  8. 关于Qrc文件的用法

    在python文件xxx.py中调用资源文件,一般来说,需要将资源放在xxx.py的相同目录下:然而,当在xxx.py下建立一个统一目录/rec则需要建立xxx.qrc文件才能让xxx.py调用,调用 ...

  9. Why Everyone Should Lift Weights

    Why Everyone Should Lift Weights by James Clear I'll say it plain and simple: you should be lifting ...

  10. (译)MySQL 8.0实验室---MySQL中的倒序索引(Descending Indexes)

    译者注:MySQL 8.0之前,不管是否指定索引建的排序方式,都会忽略创建索引时候指定的排序方式(语法上不会报错),最终都会创建为ASC方式的索引,在执行查询的时候,只存在forwarded(正向)方 ...