一、归并

  假设现在的列表分两段有序,如何将其合成为一个有序列表。这种操作称为一次归并。

1、归并过程图示

  当一个列表两段有序合并为一个有序列表的一次归并的过程如下:

  将列表分为两段,两个箭头分别指向每段的第一个:

  

  比较两段中最小的数2和1,将最小的那个值,箭头后移:

  

  接着比较两段中最小的数,将2取出,箭头后移,以此类推:

  

2、归并代码实现

def merge(li, low, mid, high):"""归并过程:param li:列表:param low:第一段第一个元素:param mid:第一段最后一个元素:param high:第二段最后一个元素:return:"""i = lowj = mid + 1   # 第二段第一个元素ltmp = []  # 新列表while i <= mid and j<= high:    # 只要左右两边都有数if li[i] < li[j]:ltmp.append(li[i])i += 1else:ltmp.append(li[j])j += 1# while执行完,肯定会有一部分没数了while i<= mid :   # 如果是第一部分仍有数ltmp.append(li[i])i += 1while j <= high:   # 如果是第二部分仍有数ltmp.append(li[j])j += 1# 将ltmp的值写回到lili[low:high+1] = ltmp   # 切片往回写li = [2, 4, 5, 7, 1, 3, 6, 8]
merge(li, 0, 3, 7)
print(li)
"""
[1, 2, 3, 4, 5, 6, 7, 8]
"""

二、归并排序——使用归并

  归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

1、归并排序图示

  

  分解:将列表越分越小,直至分成一个元素。

  终止条件:一个元素是有序的。

  合并:将两个有序列表归并,列表越来越大。

2、归并排序代码实现

def merge(li, low, mid, high):"""归并过程:param li:列表:param low:第一段第一个元素:param mid:第一段最后一个元素:param high:第二段最后一个元素:return:"""i = lowj = mid + 1   # 第二段第一个元素ltmp = []  # 新列表while i <= mid and j<= high:    # 只要左右两边都有数if li[i] < li[j]:ltmp.append(li[i])i += 1else:ltmp.append(li[j])j += 1# while执行完,肯定会有一部分没数了while i<= mid :   # 如果是第一部分仍有数ltmp.append(li[i])i += 1while j <= high:   # 如果是第二部分仍有数ltmp.append(li[j])j += 1# 将ltmp的值写回到lili[low:high+1] = ltmp   # 切片往回写def _merge_sort(li, low, high):     # 递归函数"""归并排序"""if low < high:    # 翟少有两个元素,递归mid = (low + high) // 2_merge_sort(li, low, mid)    # 把左边排好序_merge_sort(li, mid+1, high)   # 把右边排好序merge(li, low, mid, high)print(li[low: high+1])def merge_sort(li):return _merge_sort(li, 0, len(li)-1)li = list(range(10))
import random
random.shuffle(li)
print(li)
merge_sort(li)
print(li)
"""
[6, 2, 8, 3, 1, 9, 7, 5, 4, 0]
[2, 6]
[2, 6, 8]
[1, 3]
[1, 2, 3, 6, 8]
[7, 9]
[5, 7, 9]
[0, 4]
[0, 4, 5, 7, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
"""

3、归并和归并排序时间、空间复杂度  

  每一层的时间复杂度是O(n),层数是logn。因此总的时间复杂度是O(nlogn)。

  由于merge函数创建了一个ltmp的临时空间,到最大的时候长度是n,空间复杂度是O(n)。不再是原地排序。

转载于:https://www.cnblogs.com/xiugeng/p/9672639.html

算法——归并和归并排序相关推荐

  1. 归并python_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  2. 图解排序算法(四)之归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide) ...

  3. PHP实现归治算法,PHP排序算法系列之归并排序详解

    归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序 ...

  4. python选择排序算法图解_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  5. python 归并排序算法_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  6. java 排序算法总结,Java排序算法总结之归并排序

    本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...

  7. 排序算法系列:归并排序算法

    概述 上一篇我们说了一个非常简单的排序算法--选择排序.其复杂程序完全是冒泡级的,甚至比冒泡还要简单.今天要说的是一个相对比较复杂的排序算法--归并排序.复杂的原因不仅在于归并排序分成了两个部分进行解 ...

  8. 算法模板:归并排序【沈七】

    本文已收录于专栏 ⭐️ <算法通关笔记>⭐️ 算法模版:归并排序 前言 基本概念 算法思想 常用模板 完结散花 参考文献 前言 唤我沈七就好. 往期专栏: 算法模板:快速排序 基本概念 归 ...

  9. 排序算法之——二路归并排序

    排序算法之--二路归并排序 二路归并排序的思想: 一次排序过程,将已经各自有序的两个段的数据合并一个段,并且合并后依旧有序 开始,我们认为单个数据是有序的,一个数据就是一个段,一次排序之后,两个数据就 ...

最新文章

  1. 计算机组成定点数的编码,2.1.1 定点数的表示
  2. iOS开发网络数据之AFNetworking使用
  3. DCMTK:DCMTK文档
  4. MySQL全文索引应用简明教程
  5. 201110阶段二qt事件
  6. DataGridView 写入到EXCEL
  7. ios html5上架,iOS原生集成H5+详细流程
  8. 图论 —— DAG 图的最长路
  9. php修改mongo,php操作MongoDB基础教程(连接、新增、修改、删除、查询)
  10. 机器学习基础(三十七) —— 处理类别特征
  11. 疯狂连连看之开发界面布局
  12. macos sierra_如何在macOS Sierra中恢复“剩余电池时间”
  13. 新手入门学Python一定要知道的编程开发工具
  14. 基于HL7-V3医疗系统信息交换标准SOAP开发
  15. 您使用的是不受支持的命令行标记 -no-sandbox
  16. 【论文分享】BERTifying the Hidden Markov Model for Multi-Source Weakly Supervised Named Entity Recognition
  17. 无人机编程donekit及通讯(一)
  18. SSM框架中 出现的406 (Not Acceptable)
  19. 开关电源MOS管选型500V、600V、650V参数
  20. 2021这一年 | 用数字技术实现普惠金融

热门文章

  1. 报表平台——体系架构
  2. 嵌入式设备的发展—应对复杂的开发设计挑战
  3. CentOS,Ubuntu,Linux下安装yasm-1.3.0详细说明
  4. Python世界里的魔术方法(一)
  5. 2006高端IT技术图书点评(首发《中华读书报》)
  6. PyCharm vs VSCode 到底谁更牛?
  7. docker容器和镜像的区别
  8. 苹果 Mac Big Sur 如何更改锁屏时间?
  9. 长三角政务服务“一网通办” 公积金提取 `网签合同编号`如何获取?
  10. 手把手教你使用stata制作临床决策曲线