折半查找,要求待查找的序列有序。每次取中間位置的值與待查關鍵字比較,若是中間位置的值比待查關鍵字大,則在前半部分循環這個查找的過程,若是中間位置的值比待查關鍵字小,則在後半部分循環這個查找的過程。直到查找到了爲止,不然序列中沒有待查的關鍵字。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; } }