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 相关文章推荐
使用C语言来扩展Python程序和Zope服务器的教程
Apr 14 Python
Python实现ssh批量登录并执行命令
Oct 25 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
有趣的python小程序分享
Dec 05 Python
python timestamp和datetime之间转换详解
Dec 11 Python
Python 从相对路径下import的方法
Dec 04 Python
Django 创建/删除用户的示例代码
Jul 24 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
python上下文管理器异常问题解决方法
Feb 07 Python
python利用while求100内的整数和方式
Nov 07 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
PHP个人网站架设连环讲(四)
2006/10/09 PHP
PHP时间和日期函数详解
2015/05/08 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
JavaScript.The.Good.Parts阅读笔记(二)作用域&amp;闭包&amp;减缓全局空间污染
2010/11/16 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
Python中正则表达式详解
2017/05/17 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
python看某个模块的版本方法
2018/10/16 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
Python有参函数使用代码实例
2020/01/06 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
2020/03/08 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
浅析Python的命名空间与作用域
2020/11/25 Python
PyQt QMainWindow的使用示例
2021/03/24 Python
工程造价与管理专业应届生求职信
2013/11/23 职场文书
电脑饰品店的创业计划书
2014/01/21 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
员工工作能力评语
2014/12/31 职场文书
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs