利用循环实现二分查找
import java.util.Arrays;
import java.util.Scanner;
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {10,5,61,98,105,42,65,97,0};
//二分查找前必须先将数组排序,默认是由小到大的升序数组
//利用Arrays.sort()方法将数组排序
Arrays.sort(arr);
System.out.println("请输入想要查找的数:");
//接收用户输入的需要查找的数
Scanner in = new Scanner(System.in);
int num = in.nextInt();
//创建一个index来接收BinarySearch方法返回的数组下标
int index = BinarySearch(num,arr);
if (index==-1){
System.out.println("未查找到目标数据!");
}else {
System.out.println("排序后的数组为:"+Arrays.toString(arr)+"\t");
System.out.println(arr[index]+"的数组下标为:"+index);
}
}
//核心算法:二分查找算法
static int BinarySearch(int num,int[] arr){
//定义left、right表示查找的左边界与右边界
int left = 0;
int right = arr.length-1;
//mid表示二分查找中间的边界
int mid = (left+right)/2;
while (left<right){
//二分查找
if (num<arr[mid]){
//当目标值比数组中值小时,说明目标值在数组左半区
//此时把右边界移到中查找范围中间来
//由于num!=mid,故mid的值不用查找,right直接移到mid-1的位置上
right = mid-1;
} else if (num>arr[mid]) {
//当目标值比数组中值大时,与上面同理
left = mid+1;
} else if (num == arr[mid]) {
//两边不断缩小范围,直到查找到当目标值与中间值相等时,查找结束,返回mid数据
return mid;
}
//每次执行缩小边界后,都需要重新调整中界值
mid = (left+right)/2;
}
//当循环结束后,还没有返回mid值,即没有查找到,就把return赋为-1;
return -1;
}
}
利用递归实现二分查找
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {10,5,61,98,105,42,65,97,0};
//二分查找前必须先将数组排序,默认是由小到大的升序数组
//利用Arrays.sort()方法将数组排序
Arrays.sort(arr);
System.out.println("请输入想要查找的数:");
//接收用户输入的需要查找的数
Scanner in = new Scanner(System.in);
int num = in.nextInt();
int left = 0;
int right = arr.length-1;
//创建一个index来接收BinarySearch方法返回的数组下标
int index = BinarySearch(num,arr,left,right);
if (index==-1){
System.out.println("未查找到目标数据!");
}else {
System.out.println("排序后的数组为:"+Arrays.toString(arr)+"\t");
System.out.println(arr[index]+"的数组下标为:"+index);
}
}
//利用递归实现二分查找
static int BinarySearch(int num,int[] arr,int left,int right){
//跳出递归的条件
if (left < right){
return -1;
}
int mid = (left+right)/2;
if (num == arr[mid]){
return mid;
} else if (num < arr[mid]) {
return BinarySearch(num,arr,left,mid-1);
} else if (num > arr[mid]) {
return BinarySearch(num,arr,mid+1,right);
} else {
return mid;
}
}
}