Python3 二分法讲解
![](https://i-blog.csdnimg.cn/blog_migrate/65b365c30c3ce25eab2619e9e56b40ba.jpeg)
版权声明:本博客内容为学习过程中的一些记录,大部分转载内容已标明转载,部分内容如有因疏忽未注明请与我联系,转载原创内容请注明链接,谢谢! http://blog.csdn.net/xiaodongxiexie/article/details/51755027
现在学习Python也有一段时间了,今天去面试考到了python二分法的运用,写的不是很好,回来研究了下,重新上代码。
>>> def BinarySearch(array,t): #array必须是按从小到大排好序的序列
low = 0
height =len(array) - 1
while height>= low: #注意python3中此处的等号不能省掉,不然可能造成返回值是错误的
mid =(low + height) // 2 #python3中要用//号整除,不然会报错
if array[mid] > t:
height =mid - 1
elif array[mid] < t:
low =mid + 1
else:
break
print("你要查找的数字%d 出现在序列第%d位" %(t,mid + 1))
return array[mid]
>>> BinarySearch([1,2,3,4,5],3)
你要查找的数字3 出现在序列第3位
3
>>> BinarySearch([1,2,3,4,5],2)
你要查找的数字2 出现在序列第2位
2
>>> BinarySearch([1,2,3,4,5],1)
你要查找的数字1 出现在序列第1位
1
>>> BinarySearch([1,2,3,4,5],4)
你要查找的数字4 出现在序列第4位
4
>>> BinarySearch([1,4,65,78,98,102],100)*#注意看这个结果,是不是很惊奇,因为没有预判查找值是否在序列中。。。*
你要查找的数字100 出现在序列第6位
102
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
接下来的代码增加了对查找值是否在序列内做了预判:
>>> def search(array,t):
if t in array:
low = 0
hight = len(array) - 1
while low <= hight:
mid =(low + hight) // 2
if array[mid] < t:
low =mid + 1
elif array[mid] > t:
hight =mid - 1
else:
break
print("你要查找的数字%d 出现在序列第%d位" %(t,mid + 1))
return array[mid]
else:
print("你想要查找的%d不在序列内"%t)
>>> search([1,2,3,4],4)
你要查找的数字4 出现在序列第4位
4
>>> search([1,2,3,4],5)
你想要查找的5不在序列内
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
当然你也可以这样:
(实际上这个也是为比较准确且符合程序员思维的
【起码我看到大多数搜到的都是这种类似,不过我希望以上两个代码可以有所帮助】
)
>>> def BinarySearch(array,t):
low = 0
high =len(array) - 1
while high >= low:
mid =(high + low) // 2
if array[mid] > t:
high =mid - 1
elif array[mid] < t:
low =mid + 1
else:
return array[mid]
>>> BinarySearch([1,2,3,4,45,56,67,78],56)
56
>>> BinarySearch([1,2,3,4,45,56,67,78],1)
1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
正如上文第一个代码注释所说的:
定义中的序列必须是事先排好序的。
所以可以给二分法增加一个功能,就是即使是传入的序列不是按大小顺序排好的也可以在定义中对其排序,然后再查找并返回排序后的序列,
这就要牵扯到另一个比较实用的方法了:八大排序,
我现在正在学习中。。。