相信各位都玩过一个游戏:在一定区间内,乙方来猜数字,甲方每次只说甲方所述数字比目标数字时大还是小,来让乙方最终找到最后的数字,没错,这个就是典型的二分法思想题目,相信各位都知道解法这里就不多阐述了
二分查找算法
对于一个有序数组或序列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
描述起来确实不那么易懂,但只要知道和上述找数的游戏一个思想便很容易就能理解,接下来上代码:
public static int BinarySearchForArray(int[] array,int target){
if (array.length<=0){
return -1;
}
if (array[array.length-1]<target||array[0]>target){
return -1;
}
//2.进行二分查找
int left=0;//设置初始化的左下标,指向数组第一个元素下标
int right=array.length-1;//设置初始化的有下标,只想数组最后一个元素下标
int mid=0; //数组的中间下标
while (left<=right){
mid=(left+right)/2;
if (array[mid]<target){
left=mid+1;
}else if (array[mid]>target){
right=mid-1;
}else if (array[mid]==target){
return mid;
}
}
return -1;
}
这里若在数组内找不到则返回-1,否则便会返回目标数的下标
注意:此代码中array数组是从小到大排序的,若是从大到小则代码会有所不同,大家可以思考思考若从大到小排序的数组怎么实现二分查找算法
相信到这里大家对二分查找算法有了一定了解,这里可以思考一下若数组中有多个元素都与target相同,那么怎么将它们的下标以数组的形式返回出来呢?
博客以猜数字游戏引入二分法思想,介绍了二分查找算法。对于有序数组,通过比较中间位置关键字与查找关键字,不断缩小查找范围,直到找到目标或子表不存在。还给出代码示例,提醒数组排序顺序对代码的影响,并提出拓展思考问题。
776

被折叠的 条评论
为什么被折叠?



