二分查找
也称为折半查找,属于有序查找算法。用给定值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