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自动重试HTTP连接装饰器
Apr 28 Python
Python3使用Matplotlib 绘制精美的数学函数图形
Apr 11 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
详解Python 重学requests发起请求的基本方式
Feb 07 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
在django admin详情表单显示中添加自定义控件的实现
Mar 11 Python
Python如何实现定时器功能
May 28 Python
python 实现音频叠加的示例
Oct 29 Python
python绘制箱型图
Apr 27 Python
Python机器学习之逻辑回归
May 11 Python
只用40行Python代码就能写出pdf转word小工具
May 31 Python
详解Python如何批量采集京东商品数据流程
Jan 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
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
jquery replace方法去空格
2017/05/08 jQuery
php 修改密码实现代码
2017/05/24 Javascript
React Native实现进度条弹框的示例代码
2017/07/17 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
Python中将字典转换为列表的方法
2016/09/21 Python
django+mysql的使用示例
2018/11/23 Python
Python类的继承用法示例
2019/01/31 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
Python调用graphviz绘制结构化图形网络示例
2019/11/22 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
德国电子商城:ComputerUniverse
2017/04/21 全球购物
艺术应用与设计个人的自我评价
2013/11/23 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
python 下载文件的几种方式分享
2021/04/07 Python
redis实现排行榜功能
2021/05/24 Redis
什么是Python装饰器?如何定义和使用?
2022/04/11 Python
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript