算法——归并和归并排序
一、归并
假设现在的列表分两段有序,如何将其合成为一个有序列表。这种操作称为一次归并。
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
算法——归并和归并排序相关推荐
- 归并python_python基本算法之实现归并排序(Merge sort)
0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...
- 图解排序算法(四)之归并排序
图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide) ...
- PHP实现归治算法,PHP排序算法系列之归并排序详解
归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序 ...
- python选择排序算法图解_python基本算法之实现归并排序(Merge sort)
0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...
- python 归并排序算法_python基本算法之实现归并排序(Merge sort)
0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...
- java 排序算法总结,Java排序算法总结之归并排序
本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...
- 排序算法系列:归并排序算法
概述 上一篇我们说了一个非常简单的排序算法--选择排序.其复杂程序完全是冒泡级的,甚至比冒泡还要简单.今天要说的是一个相对比较复杂的排序算法--归并排序.复杂的原因不仅在于归并排序分成了两个部分进行解 ...
- 算法模板:归并排序【沈七】
本文已收录于专栏 ⭐️ <算法通关笔记>⭐️ 算法模版:归并排序 前言 基本概念 算法思想 常用模板 完结散花 参考文献 前言 唤我沈七就好. 往期专栏: 算法模板:快速排序 基本概念 归 ...
- 排序算法之——二路归并排序
排序算法之--二路归并排序 二路归并排序的思想: 一次排序过程,将已经各自有序的两个段的数据合并一个段,并且合并后依旧有序 开始,我们认为单个数据是有序的,一个数据就是一个段,一次排序之后,两个数据就 ...
最新文章
- 计算机组成定点数的编码,2.1.1 定点数的表示
- iOS开发网络数据之AFNetworking使用
- DCMTK:DCMTK文档
- MySQL全文索引应用简明教程
- 201110阶段二qt事件
- DataGridView 写入到EXCEL
- ios html5上架,iOS原生集成H5+详细流程
- 图论 —— DAG 图的最长路
- php修改mongo,php操作MongoDB基础教程(连接、新增、修改、删除、查询)
- 机器学习基础(三十七) —— 处理类别特征
- 疯狂连连看之开发界面布局
- macos sierra_如何在macOS Sierra中恢复“剩余电池时间”
- 新手入门学Python一定要知道的编程开发工具
- 基于HL7-V3医疗系统信息交换标准SOAP开发
- 您使用的是不受支持的命令行标记 -no-sandbox
- 【论文分享】BERTifying the Hidden Markov Model for Multi-Source Weakly Supervised Named Entity Recognition
- 无人机编程donekit及通讯(一)
- SSM框架中 出现的406 (Not Acceptable)
- 开关电源MOS管选型500V、600V、650V参数
- 2021这一年 | 用数字技术实现普惠金融