目录
算法的基本思想
已知条件:
- 一个有序数组,名为nums
- 一个变量,名为target
目的:
- 在nums中找target
算法思想:
- 所谓折半,就是每次访问数组的中间那一个元素。如果把数组拟作一条线段,则每次访问的就是线段的中间点。
- 将中间点记作nums[mid],那么在一次比较中,中间点和target之间有且仅有这三种关系:
- nums[mid] > target
- nums[mid] = target
- nums[mid] < target
- 如果是nums[mid] = target这种关系,那么非常令人欣喜,此时只要返回mid的值便可以。那么若是遇到其他两种情况该如何处理呢。
- 如果是在数组升序排序的情况下遇到nums[mid] > target:
- 如果在数组升序的情况下遇到nums[mid] < target:
- 通过上面的分析,可以归纳出一些有用的信息:
代码表示
当数组是升序排序时
//class1.java
public class class1{
public static int half_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;
}
if (nums[mid] > target) {
right = mid - 1;
continue;
}
if (nums[mid] < target) {
left = mid + 1;
continue;
}
}
return -1;
}
}
当数组是降序排序时
//class1.java
public class class1{
public static int half_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;
}
if (nums[mid] < target) {
right = mid - 1;
continue;
}
if (nums[mid] > target) {
left = mid + 1;
continue;
}
}
return -1;
}
}
后记
在上面的分析中,只给出了数组升序排序时的情况,并没有给出数组降序排序时的情况,读者可以根据算法的原理自行对数组降序排序的情况进行分析。
总的来说,在中间值和target不相等的情况的处理中,升序排序的数组和降序排序的数组的处理方式恰好相反。