2.二分查找
二分查找也称为折半查找,属于有序查找的算法,也就是说,必须是一个有序的线性表,才能实现二分查找算法,用定值K先与中间结点的关键字比较,中间结点把线性表分成两个子表,若相等则表示查找成功,若不相等,在根据K与该中间结点关键字的比较结果确定下一步查找那个子表,这样递归进行,直到查找到或者查找结束发现表中没有这样的结点。
时间复杂度为O(log2n)
//迭代实现
import java.util.Arrays;
public class BinarySearch {
public static void main(String[] args) {
int[]arr = {1,5,9,62,5,8,54,15,48,15,256,47,56};
Arrays.sort(arr);
int key = 8;
int index = binarySearch(arr,key);
System.out.println("index: "+index);
}
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;
}
if (arr[mid]<key){
low = mid+1;
}
if (low>high){
return -1;
}
mid = (low+high)/2;
}
return mid;
}
}
//递归实现
import java.util.Arrays;
public class BinarySearch {
public static void main(String[] args) {
int[]arr = {1,5,9,62,5,8,54,15,48,15,256,47,56};
Arrays.sort(arr);
int key = 811;
int index = binarySearch(arr,key,0,arr.length-1);
System.out.println("index:"+index);
}
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;
}
if (key<arr[mid]){
return binarySearch(arr,key,low,mid-1);
}
else{
return binarySearch(arr,key,mid+1,high);
}
}
}