`

二分法查找数字所在位置

    博客分类:
  • java
阅读更多

条件1:数组为整型数组,并且有序

条件2:用递归方法,数组包含传的数字,就返回存在于数组的位置,否则返回-1

二分法原理:有序数组,取中间数字(A)和要查找的参数(B)比较,如果A>B,则说明B在A的左侧,否则在右侧,然后再拿左侧的中间数字和B比较,以此类推。

代码:

/**
 * 二分法查找,在有序数组中找位置
 * @author 张凯
 * @email zhangkai081@gmail.com
 * @see 做人,总要信。
 */
public class TwoSearch {

	/**
	 * 二分法查找
	 * @param number 有序数组
	 * @param num	要查找的数字
	 * @param left	左边位置
	 * @param right  右边位置
	 * @param mid	中间位置
	 * @return	返回数字在数组中的位置,没有则返回-1
	 */
	public static int search(int[] number,int num,int left,int right,int mid) {
		/**
		 * 1,left == right 说明数组为空或长度为1
		 * 2,number[mid] != num 说明数组长度为1的时候,元素不等于要找的数字
		 */
		if (left == right && number[mid] != num) {
			return -1;
		}
		/**
		 * 如果number[mid] == num 那就返回mid。
		 */
		if (number[mid] == num) {
			return mid;
		}
		/**
		 * 如果mid == left 或者 mid == right ,说明从中间已经找到left或者right边了,还没有找到,返回-1
		 */
		if (mid == left || mid == right) {
			return -1;
		}
		/**
		 * 如果大于中间,那往right找,然后把right侧的再折半找
		 */
		if (num > number[mid]) {  
			mid++;
			return search(number,num,mid,right,(mid+right)/2);
		} else { 
			/**
			 * 如果小于中间的数字,就往left找,然后把left侧的再折半找
			 */
			mid--;
			return search(number,num,left,mid,(left+mid)/2);
		}
	}
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		int[] number = {1,4,5,66,77,4545};
		int num = 66;
		int left = 0;
		int right = number.length - 1;
		int mid = (left + right) / 2;
		int a = search(number, num, left, right, mid);
		System.out.println(a);
	}
}
ps:如果写的有问题,给指出来,谢谢啦。如有更好的方法也可以讨论。
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics