您的位置:首页 > 编程语言 > Java开发

[Java]二分搜索(二分查找)

2018-02-06 16:55 323 查看
对数组元素进行逐个查找显然是费时费力的工作, 我们可以使用一些方法快速地搜索出数组中元素的指定位置.
接下来我们介绍一种方法--二分搜索法:
 二分搜索法充分利用了元素间的次序关系.基本思想:将n元素分成个数大致相同的凉拌,取arr[n/2]与欲查找的x做比较,
如果x = arr[n/2]则找到x, 算法终止. 如果x<arr[n/2]则只要在数组arr的左半部继续搜索x(这里假设数组元素呈升序排列).如
果x>arr[n/2. 则只要在数组的右半部继续搜索x.下面将采用两种方式(递归/非递归)来展示二分搜索:public class TextArraySearch {
/**
* 利用递归和二分搜索法查找特定整数在数组中的位置
* @param array
* @param index
* @param beginIndex
* @param endIndex
* @return -1 要搜索的数字不合理
* @return midIndex 要搜索的数字的下标
*/
public static int binarySearch1(int[] array, int index, int beginIndex, int endIndex) {
int midIndex = (beginIndex + endIndex) / 2;
if(index < array[beginIndex] || index > array[endIndex] || beginIndex > endIndex) {
return -1;
}
if(index < array[midIndex]) {
return binarySearch1(array, index, beginIndex, midIndex-1);
}else if(index > array[midIndex]) {
return binarySearch1(array, index, midIndex+1, endIndex);
}else {
return midIndex;
}
}
/**
* 利用非递归和二分搜索法查找特定整数在数组中的位置
* @param array
* @param index
* @return -1 要搜索的数字不合理
* @return midIndex 要搜索的数字的下标
*/
public static int binarySearch2(int[] array, int index) {
int beginIndex = 0;
int endIndex = array.length-1;
int midIndex = -1;
if(index < array[beginIndex] || index > array[endIndex] || beginIndex > endIndex) {
return -1;
}

//循环判断,根据起始位置与结束为止是否相等
while(beginIndex <= endIndex) {
midIndex = (beginIndex + endIndex)/2;
if(index < array[midIndex]) {
endIndex = midIndex -1;
}else if(index > array[midIndex]) {
beginIndex = midIndex +1;
}else {
return midIndex;
}
}
return -1;
}

public static void main(String[] args) {
int[] array = new int[] {12, 3, 2, 18, 24, 15, 20};
int number = 18;
int num = 1;

//二分搜索必须是有序数列
Arrays.sort(array);
System.out.println(number + ":" + binarySearch1(array, number, 0, array.length-1));
System.out.println(number + ":" + binarySearch2(array, number));
System.out.println(number + ":" + binarySearch2(array, num));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分查找