二分算法的简单思路

/*

*使用二分查找有两个必要的前提:

*1.数组有序且知道数组的排序状态:或正序(从小到大)或逆序(从大到小)

*2.数组内无重复元素

*/

/*我们来看一个例子:小明从1-10内想了一个数,小红来猜这个数是几。

*小红从猜测次数最少的角度出发:每次只猜已经确定了范围的的中间值

*举个例子:在闭区间[5-11]上,则猜(5+11)/2 = 8

*         若闭区间[5,10],则猜(5+10)/2 = 7 (向下取整,这里是7.5向下取整即为7)

*之后通过小明反馈猜的数和想的数的大小关系,来确定下一个闭区间的范围

*直至猜出这个数。

*/


 

/*

*从一个有序数组array利用下角标闭查找一个元素

*我们知道第一个元素的角标是0,最后一个元素的角标是:[ sizeof(array) / sizeof(a[0])] - 1

*为了便于表述,用left来表示左侧闭区间的角标值,right表示右侧闭区间的角标值

*用middle来表示中间的角标值,即 middle = (left + right)/2

*按照上面例子的思路,我们可以写出以下代码:

*这里的array数组已经从小到大排序完毕。

*/



 

while(left <= right){

    int middle = (left + right)/2;

    if(array[middle]>target){right = middle - 1;}

    else if(array[middle]<target){left = middle +1;}

    else {return middle;}

}



 

/*

*变量名解释:

*left表示左侧闭区间的值,即[a,b]中的a

*right表示右侧闭区间的值,即[a,b]中的b

*middle表示闭区间中间的值,即(a+b)/2

*array表示一个数组

*target表示需要找到的数

*注意:left、right、middle均表示角标。

*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值