二分查找(折半查找)
(在下面分别例举了非递归与递归)
一、 归纳总结其思想如下:
- 有一个排好序的列表list,首端下标low = 0,末端下标 high = len(list) - 1
- 在low <= high的条件下开始二分查找(循环:二分查找就是不断的一半又一半进行搜索):
(1)取中间下标middle,那么middle = (low + high) // 2
(2)如果middle对应的值正好等于目标值,返回
(3)如果middle对应的值大于目标值,目标值所在的区间是[low,middle-1]
(4)如果middle对应的值小于目标值,目标值所在的区间是[middle+1,high] - 如果没有找到目标值就返回-1
二、 非递归查找
# coding = utf-8
import random
import sys
# 二分查找
list = []
# 随机生成列表
def generate():
n = int(input("请输入本次排序数字个数:"))
while n > 0:
list.append(random.randint(0,1000))
n -= 1
print("生成的数字列表如下:%s" %list)
#快速排序
def quickSort(markList):
if len(markList) <= 1:
return markList
middle = markList[len(markList) // 2]
leftList,rightList = [],[]
del markList[len(markList) // 2]
for value in markList:
if value > middle:
rightList.append(value)
else:
leftList.append(value)
return quickSort(leftList) + [middle] + quickSort(rightList) #迭代操作
#二分查找
def binarySearch(num,markList):
'''
# 以下代码为第一次理解错误时编写,供参考
if len(markList) < 2:
for i in range(len(markList)):
if i == num:
return 1
return 0
middle = len(markList) // 2
if markList[middle] == num:
return 1
elif markList[middle] > num:
binarySearch(num,markList[:middle])
else:
binarySearch(num,markList[middle:])
return 0
'''
low = 0
high = len(markList) - 1
while low <= high:
middle = (low + high) // 2
if markList[middle] == num:
return 1
elif markList[middle] > num:
high = middle - 1
else:
low = middle + 1
return 0
def main():
generate()
global list
list = quickSort(list)
print("排序后数字列表如下:%s" %list)
num = int(input("请输入一个数,查看是否存在于列表中:"))
flag = binarySearch(num,list)
if flag:
print("%d在列表中" %num)
else:
print("%d不在列表中" %num)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
sys.stderr.write("退出")
sys.exit(0)
非递归二分查找的主要代码如下:
def binarySearch(num,markList):
low = 0
high = len(markList) - 1
while low <= high:
middle = (low + high) // 2
if markList[middle] == num:
return 1
elif markList[middle] > num:
high = middle - 1
else:
low = middle + 1
return 0
三、 递归二分查找
# coding = utf-8
import random
import sys
# 二分查找
list = []
# 随机生成列表
def generate():
n = int(input("请输入本次排序数字个数:"))
while n > 0:
list.append(random.randint(0,1000))
n -= 1
print("生成的数字列表如下:%s" %list)
#快速排序
def quickSort(markList):
if len(markList) <= 1:
return markList
middle = markList[len(markList) // 2]
leftList,rightList = [],[]
del markList[len(markList) // 2]
for value in markList:
if value > middle:
rightList.append(value)
else:
leftList.append(value)
return quickSort(leftList) + [middle] + quickSort(rightList) #迭代操作
#二分查找
def binarySearch(num,markList,low,high):
if high >= 1:
middle = (low + high) // 2
if markList[middle] == num:
return middle
elif markList[middle] > num:
return binarySearch(num,markList,low,middle - 1)
else:
return binarySearch(num,markList,middle + 1,high)
else:
return -1
def main():
generate()
global list
list = quickSort(list)
print("排序后数字列表如下:%s" %list)
num = int(input("请输入一个数,查看是否存在于列表中:"))
flag = binarySearch(num,list,0,len(list) - 1)
if flag != -1:
print("%d在列表中" %num)
else:
print("%d不在列表中" %num)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
sys.stderr.write("退出")
sys.exit(0)
递归二分查找的主要代码如下:
def binarySearch(num,markList,low,high):
if high >= 1:
middle = (low + high) // 2
if markList[middle] == num:
return middle
elif markList[middle] > num:
return binarySearch(num,markList,low,middle - 1)
else:
return binarySearch(num,markList,middle + 1,high)
else:
return -1