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;
}
}