Bash 为什么我的二进制搜索脚本在输入后不继续执行?
我编写了一个用于整数二进制搜索的shell脚本。它接受以空格分隔的整数数组,但当代码继续执行并且我们输入要搜索的元素时,代码不会继续执行。它要么被卡住,要么接受更多的输入,这两种输入都是不希望的 代码如下:Bash 为什么我的二进制搜索脚本在输入后不继续执行?,bash,shell,Bash,Shell,我编写了一个用于整数二进制搜索的shell脚本。它接受以空格分隔的整数数组,但当代码继续执行并且我们输入要搜索的元素时,代码不会继续执行。它要么被卡住,要么接受更多的输入,这两种输入都是不希望的 代码如下: #!/bin/bash declare -a arr echo "Enter space separated sorted integers:" read -ra arr declare -i search echo -n "Enter the elemen
#!/bin/bash
declare -a arr
echo "Enter space separated sorted integers:"
read -ra arr
declare -i search
echo -n "Enter the element to be searched for: "
read -r search
index=-1
beg=0
mid=0
last=${#arr[@]}
last=$((last - 1))
while [ $beg -le $last ]; do
mid=$((beg / 2 + end / 2))
if [ $mid -eq "$search" ]; then
index=$mid
break
elif [ $mid -gt "$search" ]; then
end=$((mid - 1))
elif [ $mid -lt "$search" ]; then
beg=$((mid + 1))
fi
done
if [ $index -ne -1 ]; then
echo "Element found at $index"
else
echo "Element not found"
fi
好的,下面是我在代码中发现的错误:
end
而不是last
(感谢John Kugelman、EdmCoff、markp fuso)mid=$((beg/2+last/2))
不会表现为mid=(beg+last)/2。有时,当beg,last=5时,beg/2+last/2将在4而不是5中求值#!/bin/bash
declare -a arr
echo "Enter space separated sorted integers:"
read -ra arr
declare -i search
echo -n "Enter the element to be searched for: "
read -r search
index=-1
beg=0
mid=0
last=${#arr[@]}
last=$((last - 1))
while [ $beg -le $last ]; do
echo -e "\nbeg=$beg\nmid=$mid\nlast=$last\n"
mid=$((beg + last))
mid=$((mid/2))
if [ "${arr[$mid]}" -eq "$search" ]; then
index=$mid
break
elif [ "${arr[$mid]}" -gt "$search" ]; then
last=$((mid - 1))
elif [ "${arr[$mid]}" -lt "$search" ]; then
beg=$((mid + 1))
fi
done
if [ $index -ne -1 ]; then
echo "Element found at $((index+1))"
else
echo "Element not found"
fi
我会在循环中添加一些echo语句,以观察
beg
、mid
和end
的值是如何变化的。如果您更新了问题以包括引起问题的数组/搜索值,这会有所帮助。我会特别查看行mid=$((beg/2+end/2))
。我不确定什么是end
,你可能是说$beg
不是beg
考虑扩展你的评论卡住了,或者它正在接受更多的输入
<代码>卡滞位置/时间?它需要多少输入(相关的提示是什么)?总体设计中还有两个主要缺陷:1)如果用户输入的数字列表不是按顺序排列的,会发生什么?更大的问题2)您所有的测试都(有效地)针对数组的索引。。。在任何情况下,您实际上都没有将搜索
值与数组值/元素进行比较,即没有对${arr[]}
的引用,因此(例如)在由组成的数组中,您永远不会找到编号25
(10 15 20 25 30)
因为beg/end/last/index
将在0
和4
之间的范围内,请考虑对数组进行排序(即,不要假设用户将输入已排序的数组);在“bash sort array”上运行google搜索以获得相当多的点击率,例如,很高兴您将其排序。为什么不包括输入和输出的示例运行?Good luck.re:关于mid=$((beg/2+last/2))
行为不端的注释:如果您已经了解了为什么它不总是返回所需的值,则无法从您的注释和代码中分辨出来,因此fwiw。。。bash除法返回一个整数,因此:(1/2)+(1/2)
=0+0
=0
,而(1+1)/2
=2/2
=1
(“Duh,Mark!”);您的新代码解决了这个问题,就像mid=$((beg+last)/2))
当然,忘了提到整数除法一样。我将尽快更新它,并提供示例输入和输出