原理:
查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果待查找元素大于中间元素,则在数组中大于中间元素的那一半中查找(注意此时最小的索引和中间值的索引的关系);如果待查找元素小于中间元素,则在数组中小于中间元素的那一半中查找(注意此时最大的索引和中间值的索引的关系)。而且与开始时一样,从中间元素开始比较,如果在某一步骤数组为空,则代表找不到。这种查找算法每一次比较都使得搜索范围缩小一半!
程序实现(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("元素不在数组中")