系列文章目录
- 二分查找
- 选择排序
- 递归
- 快速排序
- 散列表
- 广度优先搜索
- 狄克斯特拉算法
- 贪婪算法
- 动态规划
- K最近邻算法
- 常用基础算法简介
文章目录
前言
由于最近放假在家没啥事情干,所以呢想把自己学习到的知识分享出来,这一系列呢主要是介绍一些常用的基础算法在java中如何使用,阅读本系列你需要一些基本的java知识和基本的代数知识。
提示:以下是本篇文章正文内容,下面案例可供参考
一、为什么要使用二分查找?
1 | 2 | 3 | 4 | 5 | ........ | 100 |
比如上面这个列表你需要以最少的次数找到需要找的数字 我会告诉你是大了,小了,对了,最简单的方式肯定是一个一个问 例如你从1开始问起 如果1不是你就可以排除1 然后再2,3,4,5 这样一直问下去。
如果目标数字是99 那么你需要99次才能找到。 这个就是最简单的查找方式 也叫傻找 。如果是100万个数据这样的查找方式效率就相对比较低了,这个时候就衍生出更优化的查找方式就是二分查找 但是这个时候大家可能又有疑问了🤔️我们怎么知道什么时候要使用二分查找 其实二分查找效率是有公式的
二、什么是二分查找?
二分查找是一种算法,其输入是一个有序的元素列表(必须有序),如果要查找的元素包含在列表中,二分查找返回其元素序列位置,否则返回null。
1 | 2 | 3 | 4 | 5 | ........ | 100 |
不知道大家有没有玩过数字炸弹 这个和数字炸弹有点像 比如上面这个列表我需要找数字88的元素下标 我们如果使用傻找我们需要找88次
我们现在使用二分查找的形式来看看是什么效果 我们先从中间开始查找 50 小了。这个时候我们就已经排除了一半的数字 再来 75 小了 这个时候就只剩下75-100之间了
接下来93(75-100中间的数字)大了 这个时候就剩75-93了 再一步一步的缩减范围 这样的形式就是二分查找了
三、代码示例
说那么多没用的 直接代码如下(示例):
//数据列表
int[] list = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int low = 0; //从哪个索引开始找
int high = list.length-1; //最大查找索引值
int item = 7; //需要查找的值
int val=-1; //结果索引值 默认是-1未找到
while (low < high) {
int mid = (low + high) / 2;//当前查找的索引
//向上取整因为java默认是向下取整 第一次可以忽略
if ((low+high)%2>0&&low>0){
++mid;
}
int guess = list[mid];//当前值
if (guess == item) {
val=mid;
break; //找到了 退出
}
if (guess > item) {
//如果当前值大于要查找的值 就把最大值high缩小
high = mid;
} else {
//如果当前值小于要查找的值 就把最小值low加大
low = mid;
}
}
System.out.println(val);// 查找到的索引值
总结
- 二分查找是一种对数形式查找数据
- 二分查找只能适合有序的列表
- 二分查找是一个更高效的查找有序列表的方式