1、普通查找
对数组循环遍历,依次比较匹配,时查找算法中最基础,最简单的算法
int[] scores = {45, 62, 15, 78, 30};
int target = 62;
int index = -1; // 保存查找到的位置
for (int i = 0; i < scores.length; i++) {
// 用要查找的目标,依次与数组中的每个元素进行比较
if (target == scores[i]) {
index = i;
break;
}
}
// 打印查找结果,与循环查找分开,便于代码分析
if (index != -1) {
System.out.println("找到了, 当前下标位置为:" + index);
} else {
System.out.println("没有找到");
}
2、二分法查找
与插入排序算法类似,它作用对象的前提是一个有序数组
先设立最小值角标、最大值角标以及中间值角标。从最中间值开始比较,若比较值比查找值大,则在剩下数列的左半轴重新划分最大值、最小值以及中间值,再进行比较查找;否则在右半轴进行相关操作;若不存在该值,最后会使得min<max,退出循环
上代码
// 有序数组
int[] scores = {15, 38, 47, 78, 93};
// 保存最小值的位置
int min = 0;
// 保存最大值的位置
int max = scores.length - 1;
// 保存中间值位置,每次循环开始都需重新计算
int mid = 0;
// 要查找的数
int target = 38;
// 查找状态
boolean flag = false;
// 每当min和max在正常范围内,要计算出来
while (min <= max) {
// 每次循环前,初始化mid值
mid = (max + min) / 2;
// 比较目标对象和mid位置元素的大小
if (target < scores[mid]) {
// 小于时,范围重新判定为mid值左边部分,重新定义max值
max = mid - 1;
} else if (target > scores[mid]) {
// 大于时,范围重新判定为mid值右边部分,重新定义min值
min = mid + 1;
} else {
// 找到,状态改变,退出循环
flag = true;
break;
}
}
不难看出,每一次查找之后,查找区间都会缩小一半,时间复杂度 为 log(2)n ,极大的提高了程序运行效率