二分查找針對的是一個有序的數據集合,查找思想有點相似分治思想。每次都經過跟區間的中間元素對比,將待查找的區間縮小爲以前的一半,直到找到要查找的元素,或者區間被縮小爲0。數組
這裏咱們實現最簡單狀況下的二分查找。升序排列的數組,無重複元素,查找其中是否包含單個元素。 非遞歸方式實現:bash
/**
* 二分查找,針對不存在重複元素的。非遞歸實現。
*
* @param a 升序數組
* @param n 數組大小
* @param value 要查找的數值
* @return 返回值表示要查找的數據在數組中的角標,若是沒有則返回-1.
*/
public static int binarySearch1(int[] a, int n, int value) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (a[mid] == value) {
return mid;
} else if (a[mid] < value) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
複製代碼
固然,也能夠使用遞歸方式實現:ui
/**
* 二分查找,針對不存在重複元素的。遞歸實現。
*
* @param a 升序數組
* @param n 數組大小
* @param value 要查找的數值
* @return 返回值表示要查找的數據在數組中的角標,若是沒有則返回-1.
*/
public static int binarySearch2(int[] a, int n, int value) {
return binarySearchInternally(a, 0, n - 1, value);
}
private static int binarySearchInternally(int[] a, int low, int high, int value) {
if (low > high) {
return -1;
}
int mid = low + ((high - low) >> 1);
if (a[mid] == value) {
return mid;
} else if (a[mid] < value) {
return binarySearchInternally(a, mid + 1, high, value);
} else {
return binarySearchInternally(a, low, mid - 1, value);
}
}
複製代碼