二分查找是一種效率較高的查找方法,時間複雜度是O(logn)java
二分查找:每次都經過跟區間中的中間元素對比,將待查找的區間縮小爲一半,直到找到要查找的元素,或 者區間被縮小爲0數組
使用前提:spa
關於查詢數據的大小,若是查詢的數據過小,直接遍歷就能夠,二者效率相差不大,若是要查找的數據太大,由於二分查找必須依賴順序表結構,因此須要申請的空間必須是連續的,有可能會出現沒有足夠的連續內存空間的狀況code
實現:遞歸
數組arr:{1,4,7,8,12,43,56,87,98,323,3545,5685},利用二分查找返回數組下標內存
例:查找43輸出5it
public static int binary(int[] arr, int n){
int start = 0;
int end = arr.length - 1;
while (start<=end){
int mid = (start + end)/2;
if(arr[mid]== n){
return mid;
} else if (n > arr[mid]) {
start = mid + 1;
} else {
end = mid - 1;
}
}
return -1;
}
複製代碼
遞歸實現:io
public static int binary(int[] arr, int n, int start, int end){
if(start > end){
return -1;
}
int mid = (start + end)/2;
if(arr[mid] == n){
return mid;
} else if (n > arr[mid]) {
return binary(arr, n, mid + 1, end);
} else {
return binary(arr, n, start, mid - 1);
}
}
複製代碼
當數組中沒有重複數據時,能夠使用上述方法,可是有些需求多是數組中有重複數據,須要查找數組中某個數的第一次出現的下標function
例:數組{1,4,7,43,43,43,56,87,98,323,3545,5685},查找43輸出3class
public static int binary(int[] arr, int n){
int start = 0;
int end = arr.length - 1;
while (start<=end){
int mid = (start + end)/2;
if(arr[mid] == n && mid>0 && arr[mid -1] != n ){
return mid;
} else if (n > arr[mid]) {
start = mid + 1;
} else {
end = mid - 1;
}
}
return -1;
}
複製代碼