一、基本思想:
假设数据是按升序排序的,对于给定值key,从序列的中间位置mid开始比较,如果当前位置array[mid]值等于value,则查找成功;若value小于当前位置值array[mid],则在数列的前半段中查找,array[low,mid-1];若value大于当前位置值array[mid],则在数列的后半段中继续查找array[mid+1,high],直到找到为止,时间复杂度:O(log(n))
二、Java代码如下:
package cn.szxy.hq;
import java.util.Arrays;
/**
* @author HQ
* @e-mail ahmashq95@gmail.com
* @date 2018/10/8.
*/
public class BinarySearch {
public static void main(String[] args) {
int array[] = {11, 23, 54, 65, 76, 13, 55, 66, 70, 98, 30, 99, 103};
//将数组排序
Arrays.sort(array);
System.out.println(Arrays.toString(array));
/*查找元素76的位置(非递归算法)*/
System.out.println(myBinarySearch(array, 76));
System.out.println(Arrays.toString(array));
//查找元素55的位置
System.out.println(recurBinarySearch(array,55,0,array.length-1));
}
/**
*二分法查找元素的位置 非递归算法
*
* @param array
* @param value
* @return
*/
public static int myBinarySearch(int array[], int value) {
int low = 0;
int high = array.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (array[mid] == value) {
return mid;
}
if (array[mid] > value) {
high = mid - 1;
}
if (array[mid] < value) {
low = mid + 1;
}
}
return -1;
}
/**
* 二分法查找元素的位置 递归算法
* @param array
* @param value
* @param low
* @param high
* @return
*/
public static int recurBinarySearch(int array[], int value, int low, int high) {
int mid;
mid = (low + high) / 2;
if (low > high) {
return -1;
}
if (array[mid] == value) {
return mid;
} else if (array[mid] > value) {
return recurBinarySearch(array, value, low, mid - 1);
} else {
return recurBinarySearch(array, value, mid + 1, high);
}
}
}