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中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
Apr 23 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
在Pandas中给多层索引降级的方法
Nov 16 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
通过cmd进入python的实例操作
Jun 26 Python
python提取log文件内容并画出图表
Jul 08 Python
flask的orm框架SQLAlchemy查询实现解析
Dec 12 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
python闭包与引用以及需要注意的陷阱
Sep 18 Python
Django-simple-captcha验证码包使用方法详解
Nov 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
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
老生常谈ES6中的类
2017/07/31 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
Python中的取模运算方法
2018/11/10 Python
python实现超市商品销售管理系统
2019/10/25 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
获奖的大学生创业计划书
2014/01/05 职场文书
总经理助理工作职责
2014/02/06 职场文书
关于安全的广播稿
2014/10/23 职场文书
考察邀请函范文
2015/01/31 职场文书
订货会主持词
2015/07/01 职场文书
高一地理教学工作总结
2015/08/12 职场文书
python中的None与NULL用法说明
2021/05/25 Python
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers