Python如何实现的二分查找算法


Posted in Python onMay 27, 2020

先来看个用Python实现的二分查找算法实例

import sys 
def search2(a,m): 
 low = 0 
 high = len(a) - 1 
 while(low <= high): 
  mid = (low + high)/2
  midval = a[mid] 
   
  if midval < m: 
   low = mid + 1 
  elif midval > m: 
   high = mid - 1 
  else: 
   print mid 
   return mid 
 print -1
 return -1
if __name__ == "__main__": 
 a = [int(i) for i in list(sys.argv[1])] 
 m = int(sys.argv[2]) 
 search2(a,m)om/weixin.html#_labeldown

运行:

administrator@ubuntu:~/Python$ python test_search2.py 123456789 4

注:

1.'__':由于python的类成员都是公有、公开的被存取public,缺少像正统面向对象语言的私有private属性。

于是就用__来将就一下,模拟私有属性。这些__属性往往是内部使用,通常情况下不用改写。也不用读取。

加上2个下划线的目的,一是不和普通公有属性重名冲突,二是不让对象的使用者(非开发者)随意使用。

2.__name__ == "__main__"表示程序脚本是直接被执行的.

如果不等于表示脚本是被其他程序用import引入的.则其__name__属性被设为模块名

Python采用二分查找找出数字的下标

要考虑有重复数字的情况

class Solution(object):
 def searchRange(self, nums, target):
  """
  :type nums: List[int]
  :type target: int
  :rtype: List[int]
  def binary_search(start,end,value):
   while end>=start:
    mid = (start+end)//2
    print(mid)
    if nums[mid]>target:
     end = mid-1
    elif nums[mid]<target: start="mid+1" else:="" if="" value="=-1:" mid-1="">=start and nums[mid+value] == target:
       end = mid+value
      else:
       return mid
     else:
      if mid+1<=end and nums[mid+value] == target:
       start = mid+value
   return -1
  a=binary_search(0,len(nums)-1,-1)
  b=binary_search(0,len(nums)-1,1)
  return [a,b]
a = Solution()
l = [2,2]
print(a.searchRange(l,2))
 
</target:>

二分算法的定义不在多说了

import sys 
source = [1,2,3,4,5,6,7,8,9,10] #must be in order 
des = int(sys.argv[1]) 
low = 0
high = len(source) - 1
targetIndex = -1
print "des=",des 
while low <= high: 
 middle = (low + high)/2
 if des == source[middle]: 
  targetIndex = middle 
  break
 elif des < source[middle]: 
  high = middle -1
  print "middle element[index=",middle,",value=",source[middle],"] is bigger than des, continue search from[",low,"to",high,"]"
 else: 
  low = middle + 1
  print "middle element[index=",middle,",value=",source[middle],"] is smaller than des, continue search from[",low,"to",high,"]"
print "search complete, target element's index in source list is ",targetIndex

最后在分享一个

'fileName--BinarySearch.py'

src = [] 
def BinarySearch(low, high, target, *src): 
 '二分查找'
 while low <= high: 
  mid = (low + high) // 2
  midVal = src[mid] 
  if target < midVal: 
   high = mid - 1
  elif target > midVal: 
   low = mid + 1
  else: 
   return mid 
  BinarySearch(low, high, target, *src) 
print('Please input 10 number:') 
for number in range(10): 
 src.append(int(input('Num %d:' % number))) 
sortList = tuple(src) 
key = int(input('Please input key:')) 
location = BinarySearch(0, len(src) - 1, key, *sortList) 
if location != None: 
 print('Find target at %d' % (location + 1)) 
else: 
 print('No target!')

实例补充

#!/usr/bin/python env
# -*- coding:utf-8 -*-

def half_search(array,target):
 low = 0
 high = len(array) - 1
 while low < high:
   mid = (low + high)/2
   if array[mid] > target:
   high = mid - 1
   elif array[mid] < target:
   low = mid + 1
   elif array[mid] == target:
   print 'I find it! It is in the position of:',mid
   return mid
   else:
   print "please contact the coder!"
 return -1

if __name__ == "__main__":
 array = [1, 2, 2, 4, 4, 5]

运行结果如下:

I find it! It is in the position of: 4
4
-1
I find it! It is in the position of: 0
0
-1

以上就是Python如何实现的二分查找算法的详细内容,更多关于用Python实现的二分查找算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
pymongo为mongodb数据库添加索引的方法
May 11 Python
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
详解python中executemany和序列的使用方法
Aug 12 Python
python利用socketserver实现并发套接字功能
Jan 26 Python
Python 编码规范(Google Python Style Guide)
May 05 Python
python实现验证码识别功能
Jun 07 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
Dec 17 Python
对Django外键关系的描述
Jul 26 Python
python在不同条件下的输入与输出
Feb 13 Python
解决Python pip 自动更新升级失败的问题
Feb 21 Python
Numpy中np.max的用法及np.maximum区别
Nov 27 Python
详解python中的异常捕获
Dec 15 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 #Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 #Python
Python列表如何更新值
May 27 #Python
Python模拟伯努利试验和二项分布代码实例
May 27 #Python
基于python纯函数实现井字棋游戏
May 27 #Python
Python实现读取并写入Excel文件过程解析
May 27 #Python
Python正则表达式如何匹配中文
May 27 #Python
You might like
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
WAF的正确bypass
2017/01/05 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
js DOM的学习笔记
2011/12/22 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
jQuery实现友好的轮播图片特效
2015/01/12 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
Vue源码探究之状态初始化
2018/11/14 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
js实现无缝轮播图效果
2020/03/09 Javascript
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
详解python中requirements.txt的一切
2017/03/03 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
python实现随机漫步方法和原理
2019/06/10 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
python基于opencv检测程序运行效率
2019/12/28 Python
东方电视购物:东方CJ
2016/10/12 全球购物
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
我的中国梦演讲稿600字
2014/08/19 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
运动与健康自我评价
2015/03/09 职场文书
在职证明书模板
2015/06/15 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers
Java 写一个简单的图书管理系统
2022/04/26 Java/Android