应用条件:
1.有序 查找的数据是按照大到小或者小到大的顺序排列的,否则要先进行排序
2.只查找一个值
原理:
1.数组左端和右端各设置一个指针 left 和 right
2.两指针的中间的值 nums[mid] 与查找的值 temp 比较
3.以由小到大排列为例,若 temp 大于 nums[mid] 则正确的值在右边,否则在左边
4.改变指针,在右边时让left来到中间重复 2.3.步骤,左边时相反
5.直到nums[mid] 与 temp 相等 返回mid 没查找到返回 -1
代码:
注释掉部分可以自己输入数组
public void test1 () {
int[] nums = {5,4,3,7,0};
Scanner scanner = new Scanner(System.in);
// for (int i = 0; i < nums.length; i++) {
// nums[i] = scanner.nextInt();
// }
// 此处添加排序代码
// for (int num : nums) {
// System.out.println(num);
// }
// int target = scanner.nextInt();
int target = 7;
System.out.println(search(nums,target));
}
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
注意,此代码循环条件中带等号,若不带等号则else if 后语句与else后语句中的 +1和-1也要去掉