二分法
适用范围为一个已经排好序的数组(升序、降序)
(升序数组)步骤:
左端点(l) 右端点(r) 查找的值(key) 中间(m) 数组(arr)
- 找到数组 l 与 r
- 让需 key 与 arr[m] 作比较
- 如果 key > arr[m]
让 l = m + 1 , 继续循环 - 如果 key < arr[m]
让 r = m - 1 , 继续循环 - 如果 key = arr[m]
则找到该值,跳出循环 - 结束循环后判断 l 是否大于 r ,来判断是否找到该值
程序代码:
# !/bin/bash
array=(1 2 3 4 5 6 7 8 9 10 11 12) #shell脚本中定义数组
read -p "num: " key #提示输入查找的值 key
l=0 #左端点 l
r=`expr ${#array[@]} - 1 ` #右端点 r
for (( ;l<=r; )) #当 l>r 时没有交集,结束循环
do
m=`expr $l + $r `
m=`expr $m / 2 ` #获取中间端点 m
if test ${array[$m]} -eq $key #若中间值(array[m])= 查找值(key)跳出循环
then
echo "$key查找成功"
break
else
if test ${array[$m]} -gt $key #若中间值(array[m])> 查找值(key)
then
r=`expr $m - 1 ` #让右端点(r) = 中间端点(m)- 1
else #若中间值(array[m])< 查找值(key)
l=`expr $m + 1 ` #让左端点(l) = 中间端点(m)- 1
fi
fi
done
if test $l -gt $r #循环结束判断是否找到需要查找的值
then #判断条件为 l>r
echo "$key 查找失败"
fi
程序运行结果:
若为降序数组,原理与升序一样,只需改动 l 与 r 的值。