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的time模块中的常用方法整理
Jun 18 Python
开始着手第一个Django项目
Jul 15 Python
Python实现判断给定列表是否有重复元素的方法
Apr 11 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 Python
Python运行提示缺少模块问题解决方案
Apr 02 Python
python opencv 实现读取、显示、写入图像的方法
Jun 08 Python
Python打印不合法的文件名
Jul 31 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 Python
Python项目打包成二进制的方法
Dec 30 Python
Python基础详解之邮件处理
Apr 28 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
Mar 22 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
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
PHP与已存在的Java应用程序集成
2006/10/09 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
js数组的操作指南
2014/12/28 Javascript
JS+CSS实现带小三角指引的滑动门效果
2015/09/22 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
Ajax基础知识详解
2017/02/17 Javascript
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
Vue CL3 配置路径别名详解
2019/05/30 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
es6中new.target的作用和使用场景简单示例分析
2020/03/14 Javascript
python使用opencv读取图片的实例
2017/08/17 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
水果花束:Fruit Bouquets
2017/12/20 全球购物
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
捐书寄语赠言
2014/01/18 职场文书
日化店促销方案
2014/03/26 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
就业导师推荐信范文
2015/03/27 职场文书
高一语文教学反思
2016/02/16 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书