JAVA-二分查找
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。(注意:二分查找的前提是数据必须是一个有序的数据)
/** * 递归方式实现二分查找 */ public static int doSearch(int[] arr, int value, int min, int max) { int mid = (min + max) / 2; // 如果索引超出范围了还没找到 // 1.如果找到最左边,即min和max都=0的情况,下一步就是max-1,之后min就大于max,说明未找到 // 2.如果找到最右边,即min和max都=8的情况,下一步就是min+1,之久min就大于max,说明未找到 if (min > max) { return -1; } else { if (arr[mid] < value) { min = mid + 1; return doSearch(arr, value, min, max); } else if (arr[mid] > value) { max = mid - 1; return doSearch(arr, value, min, max); } else { return mid; } } }
/** * 循环方式实现二分查找 */ public static int doSearchByWhile(int[] arr, int value) { int min = 0; int max = arr.length - 1; while (min <= max) { int mid = (min + max) / 2; if (arr[mid] > value) { max = mid - 1; } else if (arr[mid] < value) { min = mid + 1; } else { return mid; } } return -1;// 如果索引都超出了界限,表示未找到。 }
实现结果如下: