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 相关文章推荐
python3使用urllib示例取googletranslate(谷歌翻译)
Jan 23 Python
python服务器与android客户端socket通信实例
Nov 12 Python
Python中字符编码简介、方法及使用建议
Jan 08 Python
一键搞定python连接mysql驱动有关问题(windows版本)
Apr 23 Python
详解python websocket获取实时数据的几种常见链接方式
Jul 01 Python
Mac安装python3的方法步骤
Aug 09 Python
Django项目后台不挂断运行的方法
Aug 31 Python
python实现拉普拉斯特征图降维示例
Nov 25 Python
Tensorflow Summary用法学习笔记
Jan 10 Python
python 项目目录结构设置
Feb 14 Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 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
PHPShop存在多个安全漏洞
2006/10/09 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
举例详解Python中的split()函数的使用方法
2015/04/07 Python
浅析Python编写函数装饰器
2016/03/18 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
如何基于python生成list的所有的子集
2019/11/11 Python
浅析Django中关于session的使用
2019/12/30 Python
python下载的库包存放路径
2020/07/27 Python
Python制作运行进度条的实现效果(代码运行不无聊)
2021/02/24 Python
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
Ibatis的核心配置文件都有什么
2014/09/08 面试题
函授毕业自我鉴定
2014/02/04 职场文书
仓库文员岗位职责
2014/04/06 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
酒店厨房管理制度
2015/08/06 职场文书
环保建议书作文500字
2015/09/14 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书