二分法思路:
- 首先需要时有序数组.
- 依据有序数组可以先得到中点位置,中点可以把数组分为左右半边。
- 如果中点位置的值等于目标值,直接返回中点位置。
- 如果中点位置的值小于目标值,则去数组中点左侧按同样的方式寻找。
- 如果中点位置的值大于目标值,则取数组中点右侧按同样的方式寻找。
- 如果最后没有找到,则返回:-1。
代码实现:
package com.zzyo.calc;
import java.util.Arrays;
import java.util.Collections;
public class Test1 {
public static void main(String[] args) {
int[] arr1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//数组方案直接实现
int i = Arrays.binarySearch(arr1, 6);
System.out.println("i = " + i);
//二分法原理实现
twoCalc(arr1);
}
//二分法
private static void twoCalc(int[] arr1) {
//首末索引
int head = 0;
int end = arr1.length - 1;
//目标值
int test1 = 20;
boolean flag = true;
while (head <= end) {
//中间索引
int middle = (head + end) / 2;
if (test1 == arr1[middle]) {
System.out.println("至索引" + middle);
flag = false;
break;
} else if (test1 >= arr1[middle]) { //右边
head = middle + 1;
} else { //左边
end = middle - 1;
}
}
if (flag) {
System.out.println(" 该值不存在 " + flag);
}
}
}
二分法可以直接调用方法实现:
数组方法:
int Arrays.binarySearch(array, target)
集合方法:
int Collections.binarySearch(List, target)
总结:二分法需要有序集合为基础,不断从中间分,直到找到结果。可以发现递归和循环的次数是一样的.