python实现折半查找和归并排序算法


Posted in Python onApril 14, 2017

今天依旧是学算法,前几天在搞bbs项目,界面也很丑,评论功能好像也有BUG。现在不搞了,得学下算法和数据结构,笔试过不了,连面试的机会都没有……

今天学了折半查找算法,折半查找是蛮简单的,但是归并排序我就挺懵比,看教材C语言写的归并排序看不懂,后来参考了别人的博客,终于搞懂了。

折半查找

先看下课本对于 折半查找的讲解。注意了,折半查找是对于有序序列而言的。每次折半,则查找区间大约缩小一半。low,high分别为查找区间的第一个下标与最后一个下标。出现low>high时,说明目标关键字在整个有序序列中不存在,查找失败。

python实现折半查找和归并排序算法

看我用python编程实现:

def BinSearch(array, key, low, high):
 mid = int((low+high)/2)
 if key == array[mid]: # 若找到
  return array[mid]
 if low > high:
  return False

 if key < array[mid]:
  return BinSearch(array, key, low, mid-1) #递归
 if key > array[mid]:
  return BinSearch(array, key, mid+1, high)



if __name__ == "__main__":
 array = [4, 13, 27, 38, 49, 49, 55, 65, 76, 97]
 ret = BinSearch(array, 76, 0, len(array)-1) # 通过折半查找,找到65
 print(ret)

输出: 在列表中查找76.

76

时间复杂度:O(logn)

归并排序算法

先阐述一下排序思路:

首先归并排序使用了二分法,归根到底的思想还是分而治之。归并排序是指把无序的待排序序列分解成若干个有序子序列,并把有序子序列合并为整体有序序列的过程。长度为1的序列是有序的。因此当分解得到的子序列长度大于1时,应继续分解,直到长度为1.

(下图是分解过程,图自python编程实现归并排序)

python实现折半查找和归并排序算法

合并的过程如下:

python实现折半查找和归并排序算法

很好,你现在可以和别人说,老子会归并排序了。但是让你写代码出来,相信你是不会的……

来来来,看我用python写的归并排序算法:

def merge_sort(array): # 递归分解
 mid = int((len(array)+1)/2)
 if len(array) == 1: # 递归结束的条件,分解到列表只有一个数据时结束
  return array
 list_left = merge_sort(array[:mid])
 list_right = merge_sort(array[mid:])
 print(">>>list_left:", list_left)
 print(">>>list_right:", list_right)
 return merge(list_left, list_right) # 进行归并


def merge(list_left, list_right): # 进行归并
 final = []
 while list_left and list_right:
  if list_left[0] <= list_right[0]: # 如果将"<="改为"<",则归并排序不稳定
   final.append(list_left.pop(0))
  else:
   final.append(list_right.pop(0))

 return final+list_left+list_right # 返回排序好的列表


if __name__=="__main__":
 array = [49, 38, 65, 97, 76]
 print(merge_sort(array))输出:

输出:

>>>list_left: [49]
>>>list_right: [38]
>>>list_left: [38, 49]
>>>list_right: [65]
>>>list_left: [97]
>>>list_right: [76]
>>>list_left: [38, 49, 65]
>>>list_right: [76, 97]
[38, 49, 65, 76, 97] 

时间度杂度: 平均情况=最好情况=最坏情况=O(nlogn)

空间复杂度: O(n)

稳定性: 稳定

对序列{ 6, 5, 3, 1, 8, 7, 2, 4 }进行归并排序的实例如下:

python实现折半查找和归并排序算法

 使用归并排序为一列数字进行排序的宏观过程:

python实现折半查找和归并排序算法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python判断IP地址合法性的方法实例
Mar 13 Python
Python实现简单拆分PDF文件的方法
Jul 30 Python
python实现按行切分文本文件的方法
Apr 18 Python
关于Python数据结构中字典的心得
Dec 04 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
python3 深浅copy对比详解
Aug 12 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 Python
Python3 解决读取中文文件txt编码的问题
Dec 20 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
浅谈怎么给Python添加类型标注
Jun 08 Python
Python中22个万用公式的小结
Jul 21 Python
Python+Wordpress制作小说站
Apr 14 #Python
Python 中 list 的各项操作技巧
Apr 13 #Python
简单的python后台管理程序
Apr 13 #Python
python算法表示概念扫盲教程
Apr 13 #Python
Python常用算法学习基础教程
Apr 13 #Python
视觉直观感受若干常用排序算法
Apr 13 #Python
python常见排序算法基础教程
Apr 13 #Python
You might like
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
js TextArea的选中区域处理
2010/12/28 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
浅谈React中的元素、组件、实例和节点
2018/02/27 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
2019/10/25 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
Python的ORM框架SQLObject入门实例
2014/04/28 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
python用post访问restful服务接口的方法
2018/12/07 Python
Django中Middleware中的函数详解
2019/07/18 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
python3 正则表达式基础廖雪峰
2020/03/25 Python
python如何实时获取tcpdump输出
2020/09/16 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
12.4法制宣传日活动总结
2014/08/26 职场文书
婚庆公司计划书
2014/09/15 职场文书
领导干部作风建设总结
2014/10/23 职场文书
大学毕业生自我评价
2015/03/02 职场文书
自荐信怎么写
2015/03/04 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
4种方法python批量修改替换列表中元素
2022/04/07 Python
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL