二分法查找

来源:互联网 发布:mac炉石传说打不开 编辑:程序博客网 时间:2024/05/16 15:08
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;}}



0 0
原创粉丝点击