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 相关文章推荐
使用django-suit为django 1.7 admin后台添加模板
Nov 18 Python
python图像处理之反色实现方法
May 30 Python
Python抓取百度查询结果的方法
Jul 08 Python
Python使用numpy模块创建数组操作示例
Jun 20 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
通过python3实现投票功能代码实例
Sep 26 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
Nov 16 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
dpn网络的pytorch实现方式
Jan 14 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
Jan 27 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/03/03 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
Javascript Global对象
2009/08/13 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
JavaScript实现移动端滑动选择日期功能
2016/06/21 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
记录一篇关于redux-saga的基本使用过程
2018/08/18 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
小程序和web画三角形实现解析
2019/09/02 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
vue props default Array或是Object的正确写法说明
2020/07/30 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
基于python实现聊天室程序
2018/07/27 Python
详解django实现自定义manage命令的扩展
2019/08/13 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
工业学校毕业生自荐信范文
2014/01/03 职场文书
会计大学生职业生涯规划书范文
2014/01/13 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
2014年干部培训工作总结
2014/12/17 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
美元符号 $
2022/02/17 杂记
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android