二分查找
也稱爲折半查找,屬於有序查找算法。用給定值k先與中間結點的關鍵字比較,中間結點把線性表分成兩個子表,若相等則查找成功,若不相等,在根據k與該中間結點關鍵字的比較結果確定下一步查找哪個子表,這樣遞歸進行,直到查找到或者找結束髮現表中沒有這樣的點。
元素必須是有序的,如果是無序的則要先進行排序操作。
時間複雜度爲O(loig2n)
折半查找的前提是需要有序表順序存儲,對於靜態查找表,一次排序後不再變化,折半查找能得到不錯的效率。但對於需要頻繁執行插入或刪除操作的數據集來說,維護有序的排序會帶來不小的工作量,因此不建議使用。
迭代法
遞歸法
package 查找算法;
//二分查找
public class BinarySearch {
public static void main(String[] args) {
int arr[]={1,2,3,4,5,6,7,8,9};
int key=8;
//迭代法
int index=binarySearch(arr,key);
System.out.println("index="+index);
//遞歸法
int index1=binarySearch(arr,key,0,arr.length-1);
System.out.println("index="+index1);
}
private static int binarySearch(int[] arr, int key, int low, int high) {
if(low>high){
return -1;
}
int mid=(low+high)/2;
if(arr[mid]==key){
return mid;
}else if (key<arr[mid]){
return binarySearch(arr,key,low,mid-1);
}else {
return binarySearch(arr,key,mid+1,high);
}
}
private static int binarySearch(int[] arr, int key) {
int low=0;
int high=arr.length-1;
int mid=(low+high)/2;
while (arr[mid]!=key){
if(arr[mid]>key){
high=mid-1;
}else if (arr[mid]<key){
low=mid+1;
}
if (low>high){
return -1;
}
mid=(low+high)/2;
}
return mid;
}
}
執行結果
index=7
index=7