认识二分查找
二分查找也叫折半查找。当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法。
二分查找是针对有序集合的查找算法,如果是无序集合就遍历查找。二分查找之所以快是因为它在匹配不成功的时候,每次都能排除剩余元素中一半的元素。因此可能包含目标元素的有效范围就收缩的快。
例子:
一个有序的数组中查找某个数字是否存在。
public class BinarySearch {
public static void main(String[] args) {
// 有序数组
int[] nums = {2,3,5,13,22,32,45,67,72};
System.out.println(binarySearch(nums,32));
}
public static int binarySearch(int nums[],int target){
// 低位索引
int low = 0;
// 高位索引
int high = nums.length -1;
// 中间索引
int mid = 0;
while (low<=high){
mid = (low+high)/2;
// 等于半数
if(target == nums[mid]){
return mid;
}
// 半数以内
else if(target<nums[mid]){
high = mid -1;
}else {
// 半数以外
low = mid +1;
}
}
return -1;
}
}
递归实现二分查找
/**
* 二分查找算法
* <p>
* 二分查找是针对有序集合的查找算法
* 如果是无需集合就遍历查找
* <p>
* 核心思想:
* 二分查找快的原因,每次匹配不成功的时候都能剔除调一半的元素
*
* 递归
*/
public class BinarySearch {
public static void main(String[] args) {
// 有序数组
int[] nums = {2,3,5,13,22,32,45,67,72};
System.out.println(bsearch(nums,nums.length,13));
}
public static int bsearch(int[] a, int n, int val){
return bsearchInternally(a,0,n-1,val);
}
private static int bsearchInternally(int[] a, int low, int high, int value) {
if(low > high){
return -1;
}
int mid = (low + high)/2;
if(a[mid] == value){
return mid;
}else if(a[mid] < value){
return bsearchInternally(a,mid +1,high,value);
}else {
return bsearchInternally(a,low,mid-1,value);
}
}
}