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


Posted in Python onSeptember 01, 2020

0、前言

评判一个算法的好坏的标准:

  • 时间复杂度
  • 空间复杂度

1、归并排序算法是什么?

冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neumann于1945年发明。采用分治法(Divide and Conquer)的经典应用!!将规模较大的排序问题化归到较小的规模上解决。

基本实现包含下面的两种方法:

自上而下的递归
自下而上的迭代

将已经有的有序子序列合并,得到完全有序的子序列。就是先得到每个子序列有序,然后在使得两个子序列合并成为一个有序的。如果是把两个有序表合并成为一个有序表,成为二路归并。

归并排序的性能不受到输入数据的影响,这一个和选择排序是一样的,但是性能比选择排序要好,性能始终是O(n log n)。但是性能的优越必定是额外的内存空间作为巨大代价的!

2、算法过程图解

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

3、代码实现

代码如下(示例01):

"""
Merge_Sort 归并排序
分治算法Divide and Conquer
时间复杂度:
"""

# 切割数组 的函数
def merge_sort(alist):
 # 如果长度小于等于1 ,不能再分割了
 if len(alist) <= 1:
  return alist

 # 根据列表长度确定拆分的中间位置
 mid_index = len(alist)//2

 # 使用切片实现对列表的切分
 # left_list = alist[:mid_index]
 # right_list = alist[mid_index:]

 # 递归调用,无限切割下去
 left_list = merge_sort(alist[:mid_index])
 right_list = merge_sort(alist[mid_index:])
 return merge(left_list, right_list)

# 排序的函数
def merge(left_list, right_list):
 l_index,r_index = 0,0
 merge_list = []
 # 判断列表里面是否还有元素可以用
 while l_index < len(left_list) and r_index < len(right_list):
  # 哪边的元素小于另外一边的的元素就把哪边的元素加入进去,对应的索引加一
  if left_list[l_index] < right_list[r_index]:
   merge_list.append(left_list[l_index])
   l_index += 1
  else:
   merge_list.append(right_list[r_index])
   r_index += 1
 # 下面的这两个就是,如果有一个列表全部添加了,另外一个列表直接添加到merge_list里面了
 merge_list += left_list[l_index:]
 merge_list += right_list[r_index:]
 return merge_list

if __name__ == '__main__':
 alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
 print(f'原列表的顺序:{alist}')
 alist = merge_sort(alist)
 print(f'选择排序之后的列表的顺序:{alist}')

里面的左右列表都是被划分到了只有一个元素的是去比较和添加的。大家可以把代码放置到编译器里面,debug运行,看一哈具体的过程,结合动态图片演示理解更好!

4、评判算法

  • 最好时间复杂度:O(n log n)
  • 最坏时间复杂度:O(n log n)
  • 平均时间复杂度:O(n log n)
  • 空间复杂度:O(n)
  • 算法稳定性:稳定的排序

总结

到此这篇关于python基本算法之实现归并排序(Merge sort)的文章就介绍到这了,更多相关python归并排序(Merge sort)内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
Python中用Spark模块的使用教程
Apr 13 Python
使用Python读写文本文件及编写简单的文本编辑器
Mar 11 Python
win10环境下python3.5安装步骤图文教程
Feb 03 Python
python 实现自动远程登陆scp文件实例代码
Mar 13 Python
Python爬豆瓣电影实例
Feb 23 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
django中的图片验证码功能
Sep 18 Python
Python object类中的特殊方法代码讲解
Mar 06 Python
python学习笔记之多进程
Aug 06 Python
使用django自带的user做外键的方法
Nov 30 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 #Python
Python内置函数property()如何使用
Sep 01 #Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 #Python
python3.7.3版本和django2.2.3版本是否可以兼容
Sep 01 #Python
解决python便携版无法直接运行py文件的问题
Sep 01 #Python
django有哪些好处和优点
Sep 01 #Python
python实现简单的五子棋游戏
Sep 01 #Python
You might like
php str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
在wamp集成环境下升级php版本(实现方法)
2013/07/01 PHP
怎么在Windows系统中搭建php环境
2013/08/31 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
2013/10/26 PHP
php生成随机数的三种方法
2014/09/10 PHP
php实现的验证码文件类实例
2015/06/18 PHP
10个php函数实用却不常见
2015/10/13 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
JS代码格式化和语法着色V2
2006/10/14 Javascript
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
基于es6三点运算符的使用方法(实例讲解)
2017/10/12 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
2018/01/09 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
安装docker-compose的两种最简方法
2019/07/30 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
表彰先进集体通报
2014/01/12 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
教师外出学习心得体会
2016/01/18 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android