算法学习——二分查找(折半查找)
2023-02-18 16:37:00 时间
算法学习——二分查找
注意点
1. 二分查找的前提是有序的数组
2. 建议使用[start,end)的区间寻找,符合规范
3. 使用的是递归法
递归的人口
private static int find(int[] temp, int x) {
//如果要查找的数x比数组的最后一个数要大,则找不到数值,返回-1
if (x > temp[temp.length - 1]) {
return -1;
}
return find(temp, 0, temp.length, x);//进入递归
}
递归的出口
private static int find(int[] temp, int start, int end, int x) {
if (end - start == 1) {
return -1;//出口
}
int mid = (start + end) / 2;
if (x < temp[mid]) {
return find(temp, start, mid, x);
} else {
if (x == temp[mid]) {
return mid;//出口
}
return find(temp, mid, end, x);
}
}
按照过程跑一遍就能够对二分查找有个深刻的理解,我觉得书上的有个while循环,要想半天才能想通
二分查找,返回数组中的查找到该数的下标值
public static void main(String[] args) {
int[] data = {5, 6, 9, 15, 19, 53, 56};
System.out.println(find(data,15));
}
private static int find(int[] temp, int x) {
if (x > temp[temp.length - 1]) {
return -1;
}
return find(temp, 0, temp.length, x);
}
private static int find(int[] temp, int start, int end, int x) {
if (end - start == 1) {
return -1;
}
int mid = (start + end) / 2;
if (x < temp[mid]) {
return find(temp, start, mid, x);
} else {
if (x == temp[mid]) {
return mid;
}
return find(temp, mid, end, x);
}
}
二分查找,比要找的数大一点的数的下标(修改一下出口)
public static void main(String[] args) {
int[] data = {5, 6, 9,9, 15, 19, 53, 56};
System.out.println(find(data,14));
}
private static int find(int[] temp, int x) {
if (x > temp[temp.length - 1]) {
return -1;
}
return find(temp, 0, temp.length, x);
}
private static int find(int[] temp, int start, int end, int x) {
if (end - start == 1) {
return end;//后一个肯定比前一个大,返回后一个,start已经比较过了,temp[start]比x要小
}
int mid = (start + end) / 2;
if (x < temp[mid]) {
return find(temp, start, mid, x);
} else {
if (x == temp[mid]) {
return mid+1;//找到了当前的数,之后的那个数肯定比当前的数大点
}
return find(temp, mid, end, x);
}
}
相关文章
- Redis获取六位不重复数字(邀请码)
- pnpm monorepo实践
- Vue3源码学习:搭建monorepo开发环境(一)
- asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
- asp.net mvc 之旅—— 第一站 从简单的razor入手
- Sql Server之旅——终点站 nolock引发的三级事件的一些思考
- Sql Server之旅——第十四站 深入的探讨锁机制
- Sql Server之旅——第十三站 对锁的初步认识
- Sql Server之旅——第十二站 sqltext的参数化处理
- Sql Server之旅——第十一站 简单说说sqlserver的执行计划
- Sql Server之旅——第十站 看看DML操作对索引的影响
- Sql Server之旅——第九站 看公司这些DBA们设计的这些复合索引
- Sql Server之旅——第八站 复合索引和include索引到底有多大区别?
- Sql Server之旅——第七站 为什么都说状态少的字段不能建索引
- Sql Server之旅——第六站 使用winHex利器加深理解数据页
- Sql Server之旅——第五站 确实不得不说的DBCC命令(文后附年会福利)
- Sql Server之旅——第四站 你必须知道的非聚集索引扫描
- Sql Server之旅——第三站 解惑那些背了多年聚集索引的人
- Sql Server之旅——第二站 理解万恶的表扫描
- Sql Server之旅——第一站 那些给我们带来福利的系统视图