二分法查找

1.基本思想:二分法检索(binary search)又称折半检索,二分法检索的基本思想是设字典中的元素 从小到大有序地存放在数组中, 首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功; 否则,若key小,则在字典前半部分中继续进行二分法检索; 若key大,则在字典后半部分中继续进行二分法检索。 这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败
2.代码实现:分为递归法和非递归法
package com.sun.DoSubject;

public class BinarySearch {
	public static void main(String[] args) {
		int[] b = new int[] { 1, 3, 5, 7, 8, 9 };
		int binarySearch = binarySearch(3, b);
		System.out.println(binarySearch);
		int binarySearch2 = binarySearch2(3, b, 0, b.length);
		System.out.println(binarySearch2);
		int binarySearch3 = binarySearch3(3, b);
		System.out.println(binarySearch3);
	}

	/**
	 * 递归方法;
	 * 
	 * @param a
	 *            :要查找的数据
	 * @param b
	 *            :由小到大排列过的数组
	 * @return:返回查找值得下标 本方法中使用了数组拷贝,增加了不必要的开销
	 */
	public static int binarySearch(int a, int b[]) {
		int mid = b.length / 2;
		if (b[mid] == a) {
			return mid;
		} else if (a > b[mid]) {
			int c[] = new int[b.length - mid];
			System.arraycopy(b, mid, c, 0, b.length - mid);
			return binarySearch(a, c) + mid;// 如果在后,返回mid+position
		} else if (a < b[mid]) {
			int c[] = new int[mid];
			System.arraycopy(b, 0, c, 0, mid);
			return binarySearch(a, c);// 如果在前,直接返回mid
		}
		return -1;
	}

	/**
	 * 递归方法; 将上式进行优化,完全没有必要重新建立数组c,开始low=0;hight=b.length
	 * 
	 * @param a
	 *            :要查找的数据
	 * @param b
	 *            :由小到大排列过的数组
	 * @return:返回查找值得下标
	 */
	public static int binarySearch2(int a, int b[], int low, int hight) {
		int mid = low + (hight - low) / 2;// 直接获得中间的下标
		if (b[mid] == a) {
			return mid;
		} else if (a > b[mid]) {
			return binarySearch2(a, b, mid, hight);
		} else if (a < b[mid]) {
			return binarySearch2(a, b, 0, mid);
		}
		return -1;
	}

	/**
	 * 非递归方法;
	 * 
	 * @param a
	 * @param b
	 * @param low
	 * @param hight
	 * @return
	 */
	public static int binarySearch3(int a, int b[]) {
		int mid = 0;
		int low = 0;
		int hight = b.length;
		do {
			mid = low + (hight - low) / 2;// 直接获得中间的下标
			if (a == b[mid]) {
				return mid;
			} else if (a > b[mid]) {
				low = mid;
			} else if (a < b[mid]) {
				hight = mid;
			}
		} while (low < hight);
		return -1;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值