1.对于数据量越大的有序数组二分查找的速度比for循环越快
2.如果是乱序数组可以优先排序,但是获取的索引值会不一样
3.乱序数组如果要获取正确的索引值还是使用for循环
1 package study01;
2
3 import java.util.List;
4
5 public class BinarySearch {
6 public Integer binarySearch(List<Integer> list,int traget){
7 //创建三个指针分别指向数组的头、尾、中间
8 int left = 0;
9 int right = list.size() - 1;
10 int middle = (left + right)/2;;
11
12 //如果目标值在头或者尾部则直接返回索引,如果目标值大于数组最大值或者小于最小值则直接返回-1;
13 if (list.get(left)>traget||list.get(right)<traget){
14 return -1;
15 }else if (list.get(left)==traget){
16 return left;
17 }else if (list.get(right)==traget){
18 return right;
19 }
20
21 //如果上面没有返回值,就会执行这个循环
22 //这两个指针相遇时即时没有返回值也要退出循环,不然查找数组中没有目标值的时候会陷入死循环
23 while (left < right){
24 if (list.get(middle) < traget){
25 //如果索引middle上的值小于目标值,就说明从left到middle没有目标值,就把left的索引设置为middle右边一位的索引
26 left = ++middle;
27 //将新的left跟right的中间值赋给middle
28 middle = (left + right)/2;
29 }else if (list.get(middle)> traget){
30 //如果索引middle上的值大于目标值,就说明从middle到right没有目标值,就把right的索引设置为middle左边一位的索引
31 right = --middle;
32 //将新的left跟right的中间值赋给middle
33 middle = (left + right)/2;
34 }
35 if (list.get(middle) == traget){//判断列表在middle上的值是否为目标值
36 return middle;
37 }
38 }
39 //没找到就返回-1;
40 return -1;
41 }
42 }