二分查找也稱折半查找(Binary Search),一種效率較高的查找算法。要求查找的線性表必須是有序的,關鍵字有序排序。
1、使用遞歸。
2、使用循環迭代。
最優時間複雜度O(1),最差時間複雜度O(log n)。空間複雜度O(1)。
Java代碼示例:
/**
* 在一個整型數組中查找一個數的所在位置下標
* @param arr 數組
* @param key 目標值
* @param s 數組開始下標位置
* @param e 數組結束下標位置
* @return 符合目標值的結果下標
*/
public int find(int[] arr, int key,int s, int e){
// 基線條件
if (s > e){
return -1;
}
//求出中間位置
int midPos = (e + s)>> 1;
if (key == arr[midPos]){
return midPos;
}else if (key < arr[midPos]){
return find(arr,key,s,midPos -1);
}else {
return find(arr,key,midPos + 1,s);
}
}
/**
* 支持泛型,引入比較器
* @param arr 數組
* @param key 目標對象
* @param s 數組下標開始位
* @param e 數組下標結束位
* @param <T> 泛型
* @return 目標對象在數組的下標
*/
public <T extends Comparable<T>> int find(T[] arr, T key, int s, int e){
//基線條件
if (s > e){
return -1;
}
//求出中間位置
int midPos = (s + e) >> 1;
int cmpResult = key.compareTo(arr[midPos]);
if (cmpResult == 0){
return midPos;
}else if (cmpResult < 0){
return find(arr, key, s, midPos - 1);
}else {
return find(arr, key, midPos + 1, e);
}
}
/**
* 使用迭代循環二分查找
* @param arr 數組
* @param key 目標對象
* @param s 數組下標開始位
* @param e 數組下標結束位
* @param <T> 泛型
* @return 目標下標位
*/
public <T extends Comparable<T>> int findCycle(T[] arr, T key, int s, int e){
while (s >= 0 && e >= s ){
int midPos = (s + e) >> 1;
int cmpResult = key.compareTo(arr[midPos]);
if (cmpResult == 0){
return midPos;
}else if (cmpResult < 0){
e = midPos - 1;
}else {
s = midPos + 1;
}
}
return -1;
}