Shell算法—二分法

二分法

适用范围为一个已经排好序的数组(升序、降序)

(升序数组)步骤:
左端点(l) 右端点(r) 查找的值(key) 中间(m) 数组(arr)

  1. 找到数组 l 与 r
  2. 让需 key 与 arr[m] 作比较
  3. 如果 key > arr[m]
    让 l = m + 1 , 继续循环
  4. 如果 key < arr[m]
    让 r = m - 1 , 继续循环
  5. 如果 key = arr[m]
    则找到该值,跳出循环
  6. 结束循环后判断 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 的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值