折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,若是中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,若是中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,不然序列中没有待查的关键字。java
经过递归和非递归实现二分查找:code
public class Main { public static void main(String[] args) { int[] array = {1, 2, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59}; int position = biSearch(array, 5); int position1 = biSearch(array, 1, array.length - 1, 5); System.out.println(position); System.out.println(position1); } /** * 非递归实现二分查找 * * @param array * @param array * @return */ public static int biSearch(int array[], int key) { int low = 0; //总长度 int high = array.length - 1; while (low <= high) { //中间位置 int mid = low + (high - low) / 2; //若是中间位置的值大于要查找的内容,从左侧查找 if (array[mid] > key) high = mid - 1; else if (array[mid] < key) //若是中间位置的值小于要查找的内容,从右侧查找 low = mid + 1; else //等于就返回 return mid; } return -1; } /** * 递归实现二分查找 * * @param array * @param low 从哪一个位置开始 * @param high 到哪一个位置结束 * @param target 要查询的值 * @return */ public static int biSearch(int array[], int low, int high, int target) { if (low > high) return -1; //中间位置 int mid = low + (high - low) / 2; //中间位置的值大于要查询的内容,从左侧递归查询 if (array[mid] > target) return biSearch(array, low, mid - 1, target); if (array[mid] < target) //中间位置的值小于要查询的内容,从右侧递归查询 return biSearch(array, mid + 1, high, target); return mid; } }