二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
本篇代码分别采用了两种方法来实现二分查找,方法arr1是迭代,方法arr2是递归。
数组内容可以随意更改,但必须由小到大排列。
public class BinaryTest {
public static int compare(int low,int high,int length) {
if (low >= 0 && high <= length - 1 && low <= high)
return 1;
else
return -1;
}
public static int arr1(int[] array, int low,int high,int value) {//方法1:迭代
while (low <= high) {
//int middle = (low + high) / 2;//存在溢出
int middle = (high - low)/2+low;
if (value == array[middle])
return middle;
if (value > array[middle])
low = middle + 1;
if (value < array[middle])
high = middle - 1;
}
return -1;
}
public static int arr2(int[] array,int low,int high,int value) {//方法2:递归
assert low<high;
int middle = (high - low)/2+low;
if (array[middle] == value)
return middle;
else if (array[middle] < value)
return arr2(array,middle+1,high,value);
else if (array[middle] > value)
return arr2(array,low,middle-1,value);
else
return -1;
}
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int i : a) {
System.out.format("%3d", i);
}
System.out.println("\n请输入您要查找的数字:");
java.util.Scanner s = new java.util.Scanner(System.in);
int num = s.nextInt();
System.out.println("请输入您要查找的范围起点:");
java.util.Scanner l = new java.util.Scanner(System.in);
int low = l.nextInt();
System.out.println("请输入您要查找的范围终点:");
java.util.Scanner h = new java.util.Scanner(System.in);
int high = h.nextInt();
int value = compare(low,high,a.length);//实现输入范围合法化
if(value == -1)
System.out.println("您输入的范围有误!");
else {
boolean flag = false;
for (int k = low; k <= high; k++) {
if (num == a[k])
flag = true;
}
if (flag == false) {
System.out.println("您输入的数字不在该范围内!");
return;
}
//value = arr1(a,low,high,num);//迭代实现折半查找
value = arr2(a,low,high,num);//递归实现折半查找
if(value == -1)
System.out.println("输入的数字不在该范围内!");
else
System.out.println("经过二分法查找得知该数组中第" + (value + 1) + "个数是查找的值。");
}
}
}