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中from module import * 的一个坑
Jul 20 Python
Python实现向QQ群成员自动发邮件的方法
Nov 19 Python
Python中Scrapy爬虫图片处理详解
Nov 29 Python
python实现反转部分单向链表
Sep 27 Python
Python随机生成身份证号码及校验功能
Dec 04 Python
对Python中创建进程的两种方式以及进程池详解
Jan 14 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
python目标检测给图画框,bbox画到图上并保存案例
Mar 10 Python
Python如何省略括号方法详解
Mar 21 Python
python requests模块的使用示例
Apr 07 Python
Python集合的基础操作
Nov 01 Python
Python list列表删除元素的4种方法
Nov 01 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
一个ftp类(ini.php)
2006/10/09 PHP
laravel安装zend opcache加速器教程
2015/03/02 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
vue实现提示保存后退出的方法
2018/03/15 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
用django设置session过期时间的方法解析
2019/08/05 Python
python实现简单井字棋游戏
2020/03/04 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
Django模型验证器介绍与源码分析
2020/09/08 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
美国皮靴公司自1863年:The Frye Company
2016/11/30 全球购物
Java程序员面试90题
2013/10/19 面试题
店长岗位的工作内容
2013/11/12 职场文书
创业计划书中要认真思考的问题
2013/12/28 职场文书
商务邀请函范文
2014/01/14 职场文书
开会迟到检讨书
2014/02/03 职场文书
剪枝的学问教学反思
2014/02/07 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
2016年小学教师政治学习心得体会
2016/01/23 职场文书
virtualenv隔离Python环境的问题解析
2022/06/21 Python