归并排序python实现
归并排序python实现
归并排序
归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法
首先是一个例子
原序先通过一半一半的拆分,然后:
然后再一步一步的向上合并,在合并的过程中完成了排序,合并排序算法如下:
def merge(s1,s2,s):"""将两个列表是s1,s2按顺序融合为一个列表s,s为原列表"""# j和i就相当于两个指向的位置,i指s1,j指s2i = j = 0while i+j<len(s):# j==len(s2)时说明s2走完了,或者s1没走完并且s1中该位置是最小的if j==len(s2) or (i<len(s1) and s1[i]<s2[j]):s[i+j] = s1[i]i += 1else:s[i+j] = s2[j]j += 1
这是以列表为例,道理其实很简单,因为两个序列是排好序的,所以都从左往右,互相比较选择较小的那个数放入最后的序列,s是原序列,所以在一开始会有与len(s)的比较
完整算法
算法中通过递归并调用merge函数完成排序
def merge(s1,s2,s):"""将两个列表是s1,s2按顺序融合为一个列表s,s为原列表"""# j和i就相当于两个指向的位置,i指s1,j指s2i = j = 0while i+j<len(s):# j==len(s2)时说明s2走完了,或者s1没走完并且s1中该位置是最小的if j==len(s2) or (i<len(s1) and s1[i]<s2[j]):s[i+j] = s1[i]i += 1else:s[i+j] = s2[j]j += 1def merge_sort(s):"""归并排序"""n = len(s)# 剩一个或没有直接返回,不用排序if n < 2:return# 拆分mid = n // 2s1 = s[0:mid]s2 = s[mid:n]# 子序列递归调用排序merge_sort(s1)merge_sort(s2)# 合并merge(s1,s2,s)if __name__ == '__main__':s = [1,7,3,5,4]merge_sort(s)print(s)
时间复杂度
还拿这个图说
这个图显然是二叉树的形式,所以若集合有n个元素,那高度就为log(n)
但其实在每一层做比较的时候,都是一个一个的向序列中放小的元素,每一层都是要放n次
所以时间复杂度为nlog(n)
转载于:https://www.cnblogs.com/sfencs-hcy/p/10600197.html
归并排序python实现相关推荐
- 二路归并排序Python实现-III
二路归并排序Python实现-III 归并排序 是一种 效率比较高并且稳定的算法.时间复杂度 O(NLog(N)),空间复杂度 O(N). 归并排序(Merge Sort)是建立在归并操作上的一种有效 ...
- 归并排序Python代码
归并排序是面试最常考内容, 让你描述算法, 让你写算法, 让你分析时间复杂度 归并排序merge sort思路: 归并排序中间劈一刀,数组分两半,两边排好序,最后把左右两个合并.就是先局部有序,再整体 ...
- 算法--分治法归并排序 python
设计算法 我们可以选择使用的算法设计方法有很多,插入排序使用了增量方法:在排序子数组A[1-j-1]后,将单个元素A[ j ]插入子数组的适当位置,产生排序好的子数组A[1-j]. 而这次我们将考查另 ...
- 二路归并排序——python
from __future__ import print_functiondef merge_sort(collection):"""二路归并排序(稳定排序),结果升序算 ...
- 归并排序-python
归并排序 归并排序是采用分治法的一个非常典型的应用.归并排序的思想就是先递归分解数组,再合并数组. 将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相 ...
- 归并排序(Python代码)
1.归排序 归并排序用的是分治法,把一个大问题化解为k个中问题,每个中问题再化解为k个小问题,直至问题化为最小可解的问题.对这些问题求解,再不断地合并结果,直至合并完毕. 如下图: 注意: 合并方法, ...
- 快速排序和归并排序的区别,Python代码实现
排序理念比较: 归并排序merge sort思路: 归并排序中间劈一刀,两边再排序,然后把左右两个合并.就是先局部有序,再整体有序. 快速排序思路: 随便选择一个数字作为中间点,小于放在左边,大于放在 ...
- python归并排序_python归并排序
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python写归并排序 开始今天内容之前,先给大家推荐一款审核利器,goince ...
- python算法系列资料集(一)-2022.03.15
小学生学python(一) 小学生学python(一) - 超龄码农 - 博客园 小学生学python(二) 小学生学python(二) - 超龄码农 - 博客园 小学生学python(三) 小学生学 ...
最新文章
- Linux启动检测内存条错误,linux检测程序内存泄漏和内存错误
- R包dplyr进行数据清洗和整理
- STM32处理器存储空间布局解析
- Jquery的集合方法EACH()
- python根据一个基类生成派生类_将基类转换为派生类python(或者更像pythonic的扩展类的方式)...
- 深度学习网络调试技巧
- window10使用 Hyper-V 创建ubuntu虚拟机并使用增强会话功能
- [flask]gunicorn配置文件
- 暑训day1解题报告
- Android系统对话框
- 服务器系统咋关机呀,各种服务器系统的关机
- 【渝粤教育】电大中专电子商务网站建设与维护 (13)作业 题库
- mysql内部联结_关于mysql的内部联结
- jsp案例分析(二)-聊天室-2-逆向建模
- SVN报错Skipped ‘xxxController.class.php‘ -- Node remains in conflict
- 永远不会被杀毒软件查杀的木马捆绑机
- python javascript区别_Python,Java和JavaScript这3个编程语言未来哪个更有前景?
- 英特尔hd630驱动,intel hd graphics 630驅動
- Docker | 基于docker安装Redis
- 互联网赚钱:普通人月入上万的秘密,连载4
热门文章
- Redis分布式锁问题
- 记一次kafka集群频繁crash的排查过程
- php mysql 学习周期_学习PHPMYSQL到目前为止 所有的区别特点
- python小工具自动审单录凭证_跟着老板工作了二十年,最近来了个新员工然后我被开除了...
- 从未来所思考到的事情
- windows复制文件到 vmware centos虚拟机问题
- php,js端获取sessionid的方法
- ZooKeeper 3.4.5 分布式环境搭建
- input属性disabled和readonly的区别
- Laravel同时接收路由参数和查询字符串中的参数