[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));
}
}
接下来我们介绍一种方法--二分搜索法:
二分搜索法充分利用了元素间的次序关系.基本思想:将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));
}
}
相关文章推荐
- 【Java版本】二分查找&数字在排序数组中出现的次数
- java 二分查找算法实现
- java两种实现二分查找方式
- poj 3579 Median (二分搜索之查找第k大的值)
- Java中常用的查找算法——顺序查找和二分查找
- LeetCode-Search in Rotated Sorted Array II-在旋转数组中搜索-二分查找
- 插值搜索——本质和二分无异,是利用数据分布的规律来定查找点,其基本假设是数据分布均匀
- java 二分搜索
- 二分查找 Java
- 二分搜索问题详解(java)
- 二分(折半)法查找--Java
- 二分查找JAVA实现
- 快速查找java类和快速关键字全项目搜索
- JAVA基础复习十三-StringBuffer、数组排序、二分查找、自动拆装箱
- Java实现二分查找
- java面试题9--数组高级-二分查找
- java学习-二分查找
- java小练习(13)--二分查找
- java 实现二分查找
- Binary Search 二分查找,二分搜索 C++