Java二分查找

说明:欢迎批评指正,留言点赞!如若转载,请注明原文地址:http://www.cnblogs.com/chris0710/p/8995353.html

这篇文章将通过简单例子说明二分查找原理,闲话少说,直接上代码。

 1 /**
 2  * 二分查找
 3  *
 4  */
 5 public class BinarySearchDemo {
 6     public static void main(String[] args) {
 7         int[] arr = {1, 2, 3, 4, 5, 7};
 8         int len = arr.length;
 9         // 调用二分查找方法
10         int index1 = whileBinarySearch(arr, 4);
11         int index2 = recursionBinarySearch(arr, 4, 0, len-1);
12         int index3 = whileBinarySearch(arr, 6);
13         int index4 = recursionBinarySearch(arr, 6, 0, len-1);
14         System.out.println("使用while循环的二分查找4的位置:" + index1);
15         System.out.println("使用递归的二分查找4的位置:" + index2);
16         System.out.println("使用while循环的二分查找6的位置:" + index3);
17         System.out.println("使用递归的二分查找6的位置:" + index4);
18         /**
19          控制台输出结果:
20              使用while循环的二分查找4的位置:3
21              使用递归的二分查找4的位置:3
22              使用while循环的二分查找6的位置:-1
23              使用递归的二分查找6的位置:-1
24          */
25     }
26 
27     /**
28      * 使用while循环进行二分查找
29      */
30     public static int whileBinarySearch(int[] arr, int a) {
31         int low = 0;
32         int high = arr.length -1;
33         if (arr[low] > a || arr[high] < a || low > high) {
34             return -1;
35         }
36         while (low <= high) {
37             int middle = (low + high)/2;
38             if (arr[middle] > a) { // a在数组左半侧
39                 high = middle - 1;
40             } else if (arr[middle] < a) { // a在数组右半侧
41                 low = middle + 1;
42             } else {
43                 return middle;
44             }
45         }
46         return -1;
47     }
48     /**
49      * 使用递归进行二分查找
50      */
51     public static int recursionBinarySearch(int[] arr, int a, int low, int high) {
52         int middle = (low + high) / 2;
53         if (arr[low] > a || arr[high] < a || low > high) {
54             return -1;
55         }
56         if (arr[middle] > a) {
57             return recursionBinarySearch(arr, a, low, middle-1);
58         } else if (arr[middle] < a) {
59             return recursionBinarySearch(arr, a, middle+1, high);
60         } else {
61             return middle;
62         }
63     }
64 }

最后:推荐一个超级实用的可视化工具,目的是可以交互式的看到程序每一步的状态及参数是什么,简直perfect!

可视化工具地址:http://www.pythontutor.com/java.html#mode=edit

界面效果图如下:

posted @ 2018-05-05 17:38  Chris_Lee  阅读(168)  评论(0编辑  收藏  举报