关于二分查找跟for循环查找

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 }

 

posted @ 2021-03-08 11:04  温柔Rarry  阅读(360)  评论(0)    收藏  举报