以下是二分法的实现和基本思路
import java.util.Arrays;
/**
* @ClassName: BinarySearch
* @Description: 二分法查询
* 基本思路:
* 1.首先将待查数据num与排序的一组数据的中间位置arr[m]上的数据进行比较, 若相等,则查找成功.
* 2.若num>arr[m],则待查数据num只可能出现在右半部arr[m+1…n]中,则应在这个右半部中再进行折半查找.
* 3.若num<arr[m],则待查数据num只可能出现在左半部arr[1…m-1]中,则应在这个左半部中再进行折半查找.
* 过逐步缩小查找范围,直到找到或找不到该数据num为止。
* @Author: HelSon
* @Date 2019-06-20
* @Version V1.0
**/
public class BinarySearch {
/**
* 二分查询(递归)
*/
public static int findNum1(int[] arr, int num) {
return findNum1(arr, num, 0, arr.length);
}
private final static int findNum1(int[] arr, int num, int begin ,int end) {
if(begin > end){
return -1;
}
int m = (begin + end) >> 1;
if (num == arr[m]) {
return m;
}
if (num > arr[m]) {
return findNum1(arr, num, m+1, end);
} else {
return findNum1(arr, num, begin, m-1);
}
}
/**
* 二分查询(非递归)
* 基本思路:
* @param arr 排序后的数组
* @param num 查找的书
*/
public static int findNum2(int[] arr, int num) {
int begin = 0;
int end = arr.length - 1;
int m = 0;
while (begin <= end) {
m = (begin + end) >> 1;
if (num == arr[m]) {
return m;
}
if (num > arr[m]) {
begin = m + 1;
}
if (num < arr[m]) {
end = m - 1;
}
}
return -1;
}
public static void main(String[] args) {
// 1. 先排序
int[] arr = { 2, 10, 4, 8, 9 , 8,20,30,40,11,13};
Arrays.sort(arr);
System.out.print("排序后数组:");
for (int i : arr) {
System.out.print(i + "\t");
}
System.out.println();
// 查询的数值
int findNumber = 40;
// 2.1. 寻找(递归)
int index1 = findNum1(arr, findNumber);
System.out.println("搜索下标为:" + index1);
// 2.2. 寻找(非递归)
int index2 = findNum2(arr, findNumber);
System.out.println("搜索下标为:" + index2);
}
}