二分查找(Binary Search)也叫作折半查找。二分查找有两个要求,一个是数列有序,另一个是数列使用顺序存储结构(比如数组)。优点是比较次数少,查找速度快,平均性能好。
本文就是给定一个数组和值,用二分查找在数组中找出该值的下标。完整代码及输出如下
import java.util.Arrays;
public class binary {
public static void main(String[] args) {
int[] arr = {1,5,3,6,2,7,9,10};
int[] arr1 = sort(arr);//将分组进行排序,按升序排
System.out.println(Arrays.toString(arr1));//将排序后的值进行输出检验。
int pos = search(arr1,7);//用search函数实现在数组arr1中查找数值7的下标,返回给pos
judge(pos);//判断pos的值
}
public static void judge(int pos) {
if(pos == -1){
System.out.println("所查找的值在该数组中不存在");
}else{
System.out.println("所查找的值在该数组中的下标为:" + pos);
}
}
public static int search(int[] arr,int pos){
int left = 0;
int right = arr.length - 1;
while( left <= right){
int mid = (left + right)/2;
if(arr[mid] == pos){
return mid;//找到了就将下标mid的值返回
}else if(arr[mid] < pos){
left =mid + 1;//在mid以右区间找
}else{
right = mid - 1;//在mid以左区间找
}
}
return -1;//若查找的数不在该数组中,则返回-1
}
//使用选择排序
public static int[] sort(int[] arr) {
int temp = 0;
for(int i = 0;i < arr.length - 1;i++){
for(int j = i + 1;j < arr.length;j++){
if(arr[i] > arr[j]){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}
}
//输出为
[1, 2, 3, 5, 6, 7, 9, 10]
所查找的值在该数组中的下标为:5
代码分解如下:
int[] arr = {1,5,3,6,2,7,9,10};
可以看出,给定的数组是无序的,不符合二分查找的要求,所以首先对该数组进行排序。
int[] arr1 = sort(arr);//使用sort函数,将分组进行排序,按升序排
//使用选择排序
public static int[] sort(int[] arr) {
int temp = 0;
for(int i = 0;i < arr.length - 1;i++){
for(int j = i + 1;j < arr.length;j++){
if(arr[i] > arr[j]){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}
输出为
System.out.println(Arrays.toString(arr1));//将排序后的值进行输出检验。
[1, 2, 3, 5, 6, 7, 9, 10]//输出结果
此时,数组已按升序的顺序进行排列,可以使用二分查找了。
int pos = search(arr1,7);//用search函数实现在数组arr1中查找数值7的下标,返回给pos
调用search函数实现二分查找
public static int search(int[] arr,int pos){
int left = 0;//左端点为0,下标从0开始的
int right = arr.length - 1;//右端点为数组的长度-1,数组长度是从1开始的
while( left <= right){
int mid = (left + right)/2;
if(arr[mid] == pos){
return mid;//找到了就将下标mid的值返回
}else if(arr[mid] < pos){
left =mid + 1;//在mid以右区间找
}else{
right = mid - 1;//在mid以左区间找
}
}
return -1;//若查找的数不在该数组中,则返回-1
}
接着判断pos的值:
judge(pos);//判断pos的值
public static void judge(int pos) {
if(pos == -1){
System.out.println("所查找的值在该数组中不存在");
}else{
System.out.println("所查找的值在该数组中的下标为:" + pos);
}
}