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装饰器验证配置文件示例
Feb 24 Python
python实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
Python实现的数据结构与算法之队列详解
Apr 22 Python
Python自定义类的数组排序实现代码
Aug 28 Python
Django实现自定义404,500页面教程
Mar 26 Python
Python实现复杂对象转JSON的方法示例
Jun 22 Python
Pycharm 设置默认头的图文教程
Jan 17 Python
python列表生成器迭代器实例解析
Dec 19 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
基于PyQT实现区分左键双击和单击
May 19 Python
Python能做什么
Jun 02 Python
python logging模块的使用详解
Oct 23 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冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
Codeigniter检测表单post数据的方法
2015/03/21 PHP
js同时按下两个方向键
2007/12/01 Javascript
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
Vue.js之slot深度复制详解
2017/03/10 Javascript
js a标签点击事件
2017/03/30 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
2017/07/11 jQuery
JS伪继承prototype实现方法示例
2018/06/20 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
vue路由跳转传递参数的方式总结
2020/05/10 Javascript
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
Python实现动态加载模块、类、函数的方法分析
2017/07/18 Python
python分布式环境下的限流器的示例
2017/10/26 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
Python colormap库的安装和使用详情
2020/10/06 Python
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
大四学年自我鉴定
2013/11/13 职场文书
九月份红领巾广播稿
2014/01/22 职场文书
行政助理的岗位职责
2014/02/18 职场文书
法人代表任命书范本
2014/06/05 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
学习作风建设心得体会
2014/10/22 职场文书
Redis主从复制操作和配置详情
2022/09/23 Redis