[Java]Java实现二分查找
二分查找 又称为 折半查找,是一种常见而且效率较高的查找方式。但是二分查找要求线性表必须采用顺序存储结构,而且表中元素按照关键字排列
其流程图如下:
例子:
例:查找有序数组{10,11,12,16,18,23,29,33,48,54,57,68,77,84,98}中的元素23
Tips:lo代表low,hi代表high,mid代表middle
lo mid hi
↓ ↓ ↓
10 11 12 16 18 23 29 33 48 54 57 68 77 84 98
lo mid hi
↓ ↓ ↓
10 11 12 16 18 23 29 33 48 54 57 68 77 84 98
lomidhi
↓ ↓ ↓
10 11 12 16 18 23 29 33 48 54 57 68 77 84 98
以下是代码展示:
package Basic;
import java.util.Arrays;
import java.util.Scanner;
public class BinarySearch {
public static int rank(int key, int[] a) {
//数组必须是有序的
int low = 0;
int high = a.length - 1;
while ( low <= high ) {
//被查找的键要么不存在,要么必定处于low和high之间
int mid = low + (high - low) / 2;
if (key < a[mid])
high = mid - 1;
else if (key > a[mid])
low = mid + 1;
else
return mid;
}
return -1;//数组中没有对应数字则返回-1
}
//以下是例子
public static void main(String[] args) throws Exception{
Scanner reader = new Scanner(System.in);
System.out.println("请输入数组长度");
int length = reader.nextInt();
//创建数组并给数组赋值
int[] whitelist = new int[length];
for (int i = 0; i<length; i++) {
System.out.println("请输入第" + i +"个数组元素的值");
whitelist[i] = reader.nextInt();
}
Arrays.sort(whitelist);//将数组由大到小排列
System.out.println("请输入需要查找的数字");
int key = reader.nextInt();
int index = rank(key, whitelist);
System.out.println(index);
}
}