二分法是当数据量很大时适宜采用,但是采用二分法的前提是,数据是有序不重复的。二分法又称折半查找,故名思意就是就是从中间开始比较查找。
一、基本思路
1.首先数组的元素是要有序排列(从小到大与从大到小不同,本文就以从小到大排列来设计算法)/ (排序的算法有冒泡排序,选择排序,快速排序,在Java中可以调用 Arrays.sort() 方法来调用)。
2.设置一个变量,将数组长度的一半赋值给这个变量。
3.进行比较,如果要找的数与数组的中间的值相同,则返回设置的变量。
4.如果不相等,则在对应的区间比较,进行上述步骤。
二、代码详解
1.循环法
import java.util.Arrays;
public class TowFind {
public static void main(String[] args) {
int[] arr = { 21, 54, 86, 95, 85, 34, 65 };
Arrays.sort(arr); // 排序
int c = binarySearchArray1(arr, 54);
System.out.println(c);
}
public static int binarySearchArray1(int[] arr, int find) {
int end = arr.length - 1; // 存放数组的长度
int begin = 0;
while (begin <= end) { // 只有当begin<=end时,才可以找,如果begin>end,那么说明已经将数组全部查找完成并交错开
int mid = (end + begin) / 2;
if (find == arr[mid]) {
return mid; // 如果要找的值正好等于arr[mid]的值,即中间的值,则返回mid,即要查找的数的角标
}
if (find < arr[mid]) {
end = mid - 1;// 如果要查找的值小于arr[mid]的值,
// 则说明要查找的值在arr[mid]的左边,所以使end=mid-1,再次循环
}
if (find > arr[mid]) {
begin = mid + 1;// 如果要查找的值大于arr[mid]的值,
// 则说明要查找的值在arr[mid]的右边,所以使begin=mid+1,再次循环
}
}
return -1;// 如果沒有查找到要查找的数,则返回-1
}
}
2.递归法
import java.util.Arrays;
public class TowFind {
public static void main(String[] args) {
int[] arr = { 21, 54, 86, 95, 85, 34, 65,68 };
Arrays.sort(arr); // 排序
int d = binarySearchArray(arr, 7, 0,95);
System.out.println(d);
}
public static int binarySearchArray(int[] arr,int begin,int end,int value) {
int mid = (begin+end)/2;
if(begin>end) {
return -1;
}
if(value==arr[mid]) {
return mid;
}
if(value<arr[mid]) {
end=mid-1;
return binarySearchArray(arr,end,begin,value);
}
if(value>arr[mid]) {
begin=mid+1;
return binarySearchArray(arr,end,begin,value);
}
return 0;
}