Java_二分查找

 1 class ArrayOperateDemo4 
 2 {
 3     public static void main(String[] args) 
 4     {
 5         /*
 6         数组操作:查找
 7         找一个元素在数组中的存在的位置
 8 
 9 
10         */
11 
12         //int[] arr={7,28,12,30,61};
13         //int index =getIndex(arr,28)
14         //System.out.println("index="+index);
15         int[] arr={9,,14,24,38,44,77,90};
16 
17         int index =binarySearch(arr,77);
18         System.out.println("index="+index);
19 
20     }
21 
22     /*
23     演示二分查找法,前提:只能对有序的数组进行查找。
24     */
25     public static int getIndex(int[] arr,int key)
26     {
27         //1,需要定义三个变量,用于记录住角标的变化。
28         int min,max,mid;
29         min =0;
30         max =arr.length-1;
31 
32         //只要min和max之间有距离,就有了折半的可能,而且有可能折半多次,使用while循环
33 
34         while(min<=max)
35         {
36             //获取中间角标
37             mid =(max+min)/2;//mid = (max+min)>>1;
38 
39             //获取中间角标上的元素和key进行比较、
40             //来确定min和max的新值,或者叫做,确定新的查找范围
41             if (key>arr[mid])
42             {
43                 min = mid+1;
44             }
45             else if (key<arr[mid])
46             {
47                 max= mid -1;
48             }
49             else 
50                 return mid;
51         }
52         return -1;
53     }
54     //二分查找法的另外一种写法。
55     public static int binarySearch_2(int[] arr,int key)
56     {
57         int min,max,mid;
58         min = 0;
59         max = arr.length-1;
60         mid = (max+min)>>1;
61 
62         while(arr[mid] != key)
63         {
64             if (key>arr[mid])
65             {
66                 min =mid +1;
67             }
68             else if(key<arr[mid])
69                 max=mid -1;
70             if(min>max)
71                 return -1;
72             mid=(max+min)>>1;
73 
74         }
75         return mid;
76     }
77 }
78     
 1 class ArrayOperateTest
 2 {
 3     public static void main(String[] args) 
 4     {
 5         
 6 
 7         int[] arr={9,,14,24,38,44,77,90};
 8 
 9         int index =getInsertIndex(arr,77);
10         System.out.println("index="+index);
11 
12     }
13 
14     /*
15     思考题:
16         有一个有序的数组,要求如果网这个数组中添加一个元素,还能继续保证这个数组有序。
17         那么这个元素的位置该如何获取?
18 
19     思路:
20     1,既然是有序的数组,还有获取位置,这就是在查找,而且是有序就可以用二分查找
21     2,如果要插入的元素数组中已存在,只要找这个元素的位置就是要插入的位置
22     3,如果要插入的元素在数组中不存在,那么在最后查找的头角标插入即可
23     */
24 
25     public static int getInsertIndex(int[] arr,int key)
26     {
27         //1,需要定义三个变量,用于记录住角标的变化。
28         int min,max,mid;
29         min =0;
30         max =arr.length-1;
31 
32         //只要min和max之间有距离,就有了折半的可能,而且有可能折半多次,使用while循环
33 
34         while(min<=max)
35         {
36             //获取中间角标
37             mid =(max+min)/2;//mid = (max+min)>>1;
38 
39             //获取中间角标上的元素和key进行比较、
40             //来确定min和max的新值,或者叫做,确定新的查找范围
41             if (key>arr[mid])
42             {
43                 min = mid+1;
44             }
45             else if (key<arr[mid])
46             {
47                 max= mid -1;
48             }
49             else 
50                 return mid;
51         }
52         return min;
53 
54     }
55 
56 }
57     

 

posted @ 2017-10-31 09:11  BirdieForLove  阅读(172)  评论(0编辑  收藏  举报