前言
面试常问:给你一个排好序的数组,请你设计一种高效的算法,找出给定的目标值,如果找到返回目标值,找不到返回-1,怎么麽实现?
答:二分查找
为什么?见下文!
一、二分查找(折半查找)是什么?
- 假设数组中的元素是按升序排列。
- 将数组中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将数组分成前、后两段,如果中间位置记录的关键字大于查找关键字,则查找前一段数组,否则 查找后一段数组。
- 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
(看不懂的看下边解释)
二、算法要求
1.必须采用顺序存储结构。
2.必须按关键字大小有序排列。
三、算法实现
1.核心代码(重点)
首先初始化 low指针和high指针 不理解指针的可以把指针看作数组的下标值
low = 0 ; high = 数组长度-1; mid = (low+high)/2
每次都将目标值与mid指针所指的值 进行比较
如果目标值key>mid 说明目标值在比mid指针所指值大的一头 移动 low指针 即:low = mid + 1; 并且计算mid指针新的位置 即:mid = (low+high)/2;
如果目标值key<mid 说明目标值在比mid指针所指值小的一头 移动 high指针 即:high = mid - 1;并且计算mid指针新的位置 即:mid = (low+high)/2;
直到mid所指的值与目标值相同(找到了)或者 low指针大于等于high时(没找到目标值)结束查找
代码如下(示例):
public static int search(int []arr,int key){
int low = 0;
int high = arr.length-1;
while (low<=high){
int mid = (low+high)/2;
if (key>arr[mid]){
low = mid + 1;
}else if (key<arr[mid]){
high = mid - 1;
}else {
return key;
}
}
return -1;
}
2.测试代码
代码如下(示例):
/*
二分查找
*/
@Test
public void test(){
int[] arr = {1, 5, 6, 7, 16, 25, 29, 30};
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数:");
int key = scanner.nextInt();
int res = search(arr, key);
if (res==-1){
System.out.println("没查到目标值");
}else {
System.out.println("查找到了目标值");
}
}
该处使用的url网络请求的数据。
3.结果
请输入一个数:5
查找到了目标值
四、图解
转载请注明出处!