一:原理
二分查找又称折半查找,它是一种效率较高的查找方法。 二分查找是一种分治。
二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回数据下标,失败即表示数组不存在该元素返回-1。
前提:二分查找法只适用于顺序存储的有序表。即:二分查找的前提是需要查找的数组必须是已排序的
二:代码实现
package package_4;
/**
* 二分查找
* @author luhuanju
*/
public class Seclect {
public static void main(String[] args) {
// 必须是排序过的
int data[] = new int[] { 1, 2, 4, 5, 8, 9, 13, 17, 19, 21, 22, 23 };
// 可看到控制台输出结果为6
System.out.println(BinSearch(data, 0, 12, 8));
System.out.println(Search(data, 8));
}
/**
* 采用递归的方式实现二分查找(自己调用自己)
* @param data
* :排序的数据源数组
* @param startLocation
* :开始的下标,因为二分查找
* @param endLocation
* :数据长度
* @param key
* :要查找的key
* @return :key的下标
*/
public static int BinSearch(int[] data, int startLocation, int endLocation,
int key) {
if (startLocation <= endLocation) {
int middle = (startLocation + endLocation) / 2;
if (key == data[middle]) {// 中间值
return middle;
} else if (key < data[middle]) {// 在左半
return BinSearch(data, startLocation, middle - 1, key);
} else if (key > data[middle]) {// 在右半
return BinSearch(data, middle + 1, endLocation, key);
}
}
return -1;// 不存在,
}
/**
* 采用非递归的方法实现二分查找(也就是采用while)
* @param data
* :数据源
* @param key
* :key
* @return :下标
*/
public static int Search(int[] data, int key) {
int low = 0;
int high = data.length - 1;
while (low <= high) {
int middle = (low + high) / 2;
if (key == data[middle]) {
return middle;
} else if (key < data[middle]) {
high = middle - 1;
} else {
low = middle + 1;
}
}
return -1;
}
}