原理:
查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果待查找元素大于中间元素,则在数组中大于中间元素的那一半中查找(注意此时最小的索引和中间值的索引的关系);如果待查找元素小于中间元素,则在数组中小于中间元素的那一半中查找(注意此时最大的索引和中间值的索引的关系)。而且与开始时一样,从中间元素开始比较,如果在某一步骤数组为空,则代表找不到。这种查找算法每一次比较都使得搜索范围缩小一半!
程序实现(C++):
//假设待查找的数组已经排好序,且从大到小排序!
void binary_search(int *p) //把数组名当做参数传递进来!
{
int x, n, low, high, flag, mid;
cout << "输入要查找的元素:";
cin >> x;
low = 0; high = n - 1;
flag = 0; //用标志位来判断找到与否!
while (low <= high && !flag)
{
mid = (low + high) / 2;
if (x < p[mid])
high = mid - 1;
else if (x == p[mid])
flag = 1;
else
low = mid + 1;
}
if (flag) //如果找到!
cout << x << "是数组中第" << mid + 1 << "个元素。" << endl;
else
cout << "数组中没有这个元素!" << endl;
}
程序实现(Python):
# 用递归的方法实现二分查找!!!如果找到,则返回待查找元素在数组中的索引,否则返回 -1
def binary_search(arr, m, n, x):
mid = int(m + (n - m) / 2) # 元素的中间位置
if arr[mid] == x:
return mid
# 要查找的元素小于中间位置元素的值,则只需要再比较左半边的元素
elif arr[mid] > x:
return binary_search(arr, m, mid - 1, x)
# 要查找的元素大于中间位置元素的值,则只需要再比较右半边的元素
elif arr[mid] < x:
return binary_search(arr, mid + 1, n, x)
else:
return -1 # 不存在
if __name__ =='__main__':
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
x = eval(input("输入待查找的元素的值:"))
n = len(arr)
low, high = 0, n - 1
# 函数调用
if len(arr) > 0:
result = binary_search(arr, low, high, x)
if result != -1:
print("元素在数组中的索引为:{}".format(result))
else:
print("元素不在数组中")