二分查找法-练习

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。
它要求必须是有序数组

查找过程

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
例:在有序数组中查找某个元素的位置:

package PracticeFunction;
//有序数组中查找某个元素的位置
public class BinarySearch {
	public static void main(String[] args) {
		int[] arr = {1,2,3,4,5,6};
		System.out.println(binarySearch(arr,5));
	}
	static int binarySearch(int[] arr,int target) {
		//查找区间开始定义为整个数组,每和中间值比较一次大小,可以缩小一半的查找区间
		int min = 0;//min是查找区间最左元素角标,初始为0
		int max = arr.length-1;//max是查找区间最右边角标,初始为最大值
		int mid = (min+max)>>1;//右移n位相当于除以2的n次方.
		while(min<=max) {
			if(target<arr[mid]) {
				max = mid-1;//若target<arr[mid],则说明a在左半边,把查找范围缩小到左边一半,也就是把max移到mid左边
			}
			else if(arr[mid]<target){
				min = mid+1;//若arr[mid]<target,则说明a在右半边,把查找范围缩小到右边一半,也就是把min移到mid右边
			}else {
				return mid;//若arr[mid]=target,mid就是a的位置角标
			}
			mid = (max+min)>>1;
		}
		return -1;//没有该元素则返回-1
	}
}

二分查找的递归算法

递归算法有两个特点

  • 由两个过程组成:追溯和回归
  • 每一步的计算方案可以用这个方案的一个更小版本或基本条件来实现。
    X(k)=X-------------当k=1时;
    X(k)=X(k-1)X-----当k!=1时
    注意,正确的递归函数必须是可终止的,所有递归程序必须至少拥有一个基本条件,而且必须确保他们会最终到达某个基本分支。
public static int binarySearch(int[] arr,int min,int max;int target){
	int mid = (min+max)/2;
	if(min>max){
		return -1;
	}else if(target<arr[mid]){
		return binarySearch(arr,min,mid-1,target);
	}else if(target>arr[mid]){
		return binarySearch(arr,mid+1,max,target);
	}else{
		return mid;
	}
		
	
}

二分查找法的变例应用:
题目:在有序数组中,若要插入一个数字,使数组仍然有序,求这个数字要插入的位置
解法:只要把上例中的return -1;改成return min即可.

分析:
在上一个例子中,查找过程中[min,max]的区间的两个极值会越来越靠近mid,除非(min+max)/2刚好等于target则结束,返回该值.但是当target不存在时,区间[min,max]会无限靠近target,直到min和max相邻,也就是max=min+1,
比如上例中, 我要查找2.5,
区间会逐渐缩小到[2,3],此时mid=(2+3)/2=2<2.5,
满足条件继续循环,min继续+1,区间变成[3,3],此时mid=3>2.5,则max-1,
此时max<min,循环结束,返回-1.
注意,结束时min=2,这个值正好是2.5插入时的位置,因此只要把return -1改成return min就是
这道题目的解.

猜你喜欢

转载自blog.csdn.net/zhyue28/article/details/88095005