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引用(import)文件夹下的py文件的方法
Aug 26 Python
简化Python的Django框架代码的一些示例
Apr 20 Python
Python常用小技巧总结
Jun 01 Python
python操作mysql数据库
Mar 05 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
基于python实现高速视频传输程序
May 05 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 Python
Python爬取365好书中小说代码实例
Feb 28 Python
python操作yaml说明
Apr 08 Python
python3 循环读取excel文件并写入json操作
Jul 14 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常用代码大全(新手入门必备)
2010/06/29 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
php日历制作代码分享
2014/01/20 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
Javascript 面向对象特性
2009/12/28 Javascript
JavaScript 学习笔记(十一)
2010/01/19 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
2015/12/08 Javascript
js面向对象编程总结
2017/02/16 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
在微信小程序中使用vant的方法
2019/06/07 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
python字典排序实例详解
2015/05/20 Python
python-str,list,set间的转换实例
2018/06/27 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
正科级干部考察材料
2014/05/29 职场文书
违纪检讨书范文
2015/01/27 职场文书
放假通知范文
2015/04/14 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL