二分查找法
- 概述
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,二分查找要求数组数据必须采用顺 序存储结构有序排列。 - 原理
首先,假设数组中元素是按升序排列,将数组中间位置的数据与查找数据比较,如果两者相等,则查找成功;否则利用中间位置记录将数组分成前、后两个子数组,如果中间位置数据大于查找数据,则进一步查找前子数组,否则进一步查找后子数组。重复以上过程,直到找到满足条件的数据,则表示查找成功,直到子数组不存在为止,表示查找不成功。
Scanner scan = new Scanner(System.in);
int[] nums = new int[9];
//初始化数组,随机100以内的数
for (int i = 0; i < nums.length; i++) {
nums[i]=(int) (Math.random()*100);
}
System.out.println("初始数组为:");
for (int i : nums) {
System.out.print(i+"\t");
}
//二分查找需要一个有顺序的数组,所以对初始化的数组进行排序
for (int i = 0; i < nums.length-1; i++) {
for (int j = 0; j < nums.length-i-1; j++) {
if (nums[j]>nums[j+1]) {
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
System.out.println("\n排序后数组为:");
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+"\t");
}
//二分查找
//最小下标
int minIndex=0;
//最大下标
int maxIndex=nums.length-1;
//中间下标
int centerIndex=(minIndex+maxIndex)/2;
//查找元素
System.out.print("\n请输入需要查找的元素:");
int findNum=scan.nextInt();
while (true) {
if (nums[centerIndex]>findNum) {
//当查找目标小于中间值时,此时目标值在左边,此时最大下标为中间下标-1
maxIndex=centerIndex-1;
} else if (nums[centerIndex]<findNum) {
//当查找目标大于中间值时,此时目标值在右边,此时最小下标为中间下标+1
minIndex=centerIndex+1;
}else {
System.out.println("查找元素"+findNum+"的下标为:"+centerIndex);
break;
}
if (minIndex>maxIndex) {
//当最小下标大于最大下标时,说明找不到目标值
System.out.println("查找元素的下标不存在");
break;
}
//每次查找后边界都会发生变化,所以就重新更新中间下标
centerIndex=(minIndex+maxIndex)/2;
}
// 关闭扫描,释放资源
scan.close();
效果图