二分查找(又称折半查找)
1. 适用场景:顺序存储结构且按有序排列
2. 查找过程:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
3. 算法复杂度
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.
时间复杂度即是while循环的次数。
总共有n个元素,
渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
时间复杂度可以表示O(h)=O(log2n)
package 二分查找;
public class BinarySearch {
public static void main(String[] args) {
int[] array = {1,3,8,10,11,22,100};
//要查找的数值是10
int index1 = binSearch_1(10, array);
System.out.println("index1="+index1);
int index2 = binSearch_2(10, array, 0, array.length-1);
System.out.println("index2="+index2);
}
/*
*1.循环实现二分算法
*/
/**
* @param key 要查找的数值
* @param array 待查找的数组 默认array数组有序且是升序的
* @return 返回对应的下标,-1代表没有找到
*/
public static int binSearch_1(int key, int[] array) {
int low = 0; //第一个下标
int high = array.length - 1;//最后一个下标
int middle = 0;
//防越界
if (key < array[low] || key > array[high] || low > high) {
return -1;
}
while (low <= high) {
middle = (low + high) / 2;
if (array[middle] == key) {
return middle ;
} else if (array[middle] < key) {
low = middle + 1;//需要去右边找
} else {
high = middle - 1;//需要去左边找
}
}
return -1;
}
/*
*2. 递归实现二分算法
*/
/**
* @param key 要查找的数值
* @param array 待查找的数组 默认array数组有序且是升序的
* @param low 数组起始下标
* @param high 数组末尾下标
* @return 返回对应的下标,-1代表没有找到
*/
public static int binSearch_2(int key,int[] array,int low,int high){
//防越界
if (key < array[low] || key > array[high] || low > high) {
return -1;
}
int middle = (low+high)/2;
if(array[middle]>key){
//大于关键字
return binSearch_2(key,array,low,middle-1);
}else if(array[middle]<key){
//小于关键字
return binSearch_2(key,array,middle+1,high);
}else{
return middle ;
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战