一、问题描述
Description
输入为有序数组和待查找的数,输出为待查找的数在该数组中的位置(若待查找的数不在该数组中,输出 -1 )
Input
输入为两行,第一行为有序数组,元素以空格分隔; 第二行为待查找的数,如:
11 20 29 37 41 50 60 66
66
Output
输出为待查找数所在位置,如对于上面“输入描述”中的例子,输出应为:
7
Sample Input 1
1 2 3 3
Sample Output 1
2
Sample Input 2
1 2 3 4
Sample Output 2
-1
二、代码解析
这段 Java 代码实现了二分查找算法。在这个算法中,数组 a
包含了被搜索的元素,k
是需要查找的目标元素。程序首先读取一行输入,将其分割成整数,并将其存储在数组 a
中。接着,程序读取一个整数 k
,表示需要查找的目标元素。
然后,使用二分查找算法,在数组 a
中查找目标元素 k
。二分查找的基本思想是:首先确定数组的中间位置,如果中间位置的元素等于目标元素,则查找成功;如果中间位置的元素大于目标元素,则在数组的左半部分继续查找;如果中间位置的元素小于目标元素,则在数组的右半部分继续查找。重复这个过程,直到找到目标元素或者确定目标元素不在数组中。
这段代码中,i
和 j
表示当前搜索范围的起始和结束位置,mid
表示中间位置。在每一步迭代中,首先判断中间位置的元素是否等于目标元素 k
,如果是,则将当前中间位置 mid
赋给 index
,表示找到了目标元素的索引。如果中间位置的元素大于 k
,则将搜索范围缩小为左半部分,即将 j
更新为 mid - 1
。如果中间位置的元素小于 k
,则将搜索范围缩小为右半部分,即将 i
更新为 mid + 1
。
最终,如果找到了目标元素,index
将存储目标元素在数组中的索引;如果没有找到,index
保持为初始值 -1
。程序最后输出 index
的值,表示目标元素在数组中的位置(如果找到的话)或者 -1
(如果没有找到)。
三、完整代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int a[]=new int[1000];
int i,n,mid,j;
String str;
str=in.nextLine();
String divint[]=str.split(" ");
n=divint.length;
for(i=0;i<n;i++) {
a[i]=Integer.parseInt(divint[i]);
}
int k=in.nextInt();
int index=-1;
j=n-1;
i=0;
mid=(i+j)/2;
while(i<=j) {
if(a[mid]==k) {
index=mid;
break;
}
else if(a[mid]>k) {
j=mid-1;
mid=(i+j)/2;
}
else {
i=mid+1;
mid=(i+j)/2;
}
}
System.out.println(index);
}
}