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
界面效果图如下: