对于一个递增序列,我们要查找这个序列中某个元素的下标位置。
如: 在2 5 6 8 22 34 225…中,我们想找到数字5的位置
最简单的思路是:
我们可以通过循环遍历这个序列,来依次比对数字5,如果找到了则停止遍历。这种思路在这个序列的元素个数不是很大的时候,是非常有效的,但一旦涉及数据规模比较大的时候,这种思路写出来的程序就很容易超时崩溃。
今天我们来讨论一个很重要的算法思路----二分,所谓二分顾名思义就是在一次操作中,我们把数据分成两部分来处理,这种思路大大减少了程序的时间复杂度。
二分查找我们可以想象成收网打鱼,最开始时这张网是覆盖整个序列的,我们只需比较序列的中间元素与我们要找的元素之间的大小关系。如果中间元素等于我们的目标数字,那我们就找到了这个鱼位置了,直接收网;如果中间元素大于我们的目标数字,那我们就要在序列的前半部分继续找,我们的大网就收紧一半了,后半部分直接可以不管了(因为这个是递增序列,中间元素以后的所有元素肯定都大于我们要找的数字)。以此类推,我们这张网不断收紧,最后一定会找到这条鱼(目标数字)的位置。
可以画出示意图:
根据上面的思路我们可以写出我们的核心代码部分:
while(leftnum<=rightnum){
//取中点脚标
mid = (rightnum+leftnum)/2;
if(a[mid]==n)break;//如果找到n就停止循环
else if(a[mid]>n){
rightnum = mid - 1;