[算法基础]线性、二分查找
最编程
2024-07-07 09:27:36
...
问题: 现有数组int[] arr = new int[]{1,3,5,63,2,55,78}
,找出值为2
的元素,并返回其下标。
1. 线性查找(顺序查找)
- 声明两个变量:查找的元素、保存索引的变量
- 用for循环依次遍历
注意: 这里只查找一个元素,索引可以用于判断是否找到该元素。
public static void main(String[] args) {
int[] arr = new int[]{1,3,5,63,2,55,78};
int value = 2;
int index = -1;
for (int i = 0; i < arr.length - 1; i++) {
// 当找到元素后,拿到索引,结束循环。这里只查找一个。
if ( arr[i] == value) {
index =i;
break;
}
}
if ( index == -1 ){
System.out.println("元素不存在!");
}
System.out.println("元素找到了,索引为:" + index);
//输出:4
}
2. 二分法查找
二分法查找的前提:数组是有序的
思路
- 将数组从中间分割为两部分(二分法),
- 用要查找的元素和数组中间的元素进行比较
- 若查找元素大于数组中间元素,则在数组右边查找;反之则在数组左边查找
- 再将查找的部分按前面的思路进行二分法查找,直到找到元素。
实现步骤
- 声明一个引用保存要查找的值value
- 声明头部下标
headIndex = 0
、尾部下标endIndex = arr.length-1
- 声明一个阈值
flag = flae
,用于判断元素是否存在使用 - 判断:
headIndex <= endIndex
是否相等。 - 若不相等
headIndex < endIndex
:计算中间元素下标:midIndex = (headIndex + endIndex)/2
- 若
value=arr[midIndex]
:首尾索引相等则是同一个元素,则找到元素设置flag = true
- 若
value > arr[midIndex]
:则元素在右边。修改左边界headIndex = minIndex + 1
, - 若
value < arr[midIndex]
:则元素在左边。修改左边界endIndex = minIndex - 1
, - 最后通过
flag
判断是否找到元素。
代码实现
public static void main(String[] args) {
int[] arr = new int[]{-99,-54,-2,0,2,33,43,256,999};
// 1.声明一个引用保存要查找的值value
int value = 1;
// 用于判断元素是否找到
boolean flag = false;
// 2.声明头部下标headIndex=0、尾部下标endIndex=arr.length-1
int headIndex = 0, endIndex = arr.length - 1;
// 3.判断:headIndex <= endIndex 是否相等,
while ( headIndex <= endIndex ){ //注意结束条件
int midIndex = (headIndex + endIndex)/2;
// 首尾索引相等则是同一个元素,找到了该元素
if ( value == arr[midIndex] ) {
flag = true;
System.out.println( "索引找到了:" + midIndex );
break;
}else if ( value > arr[midIndex] ) {// 则元素在右边,在右边查找
headIndex = midIndex + 1;
}else { // 否则value < arr[midIndex]元素在左边,在左边查找
endIndex = midIndex - 1;
}
}
// 若循环结束 flag = false 则没有找到元素
if ( !flag ) {
System.out.println( "元素不存在!" );
}
}
3. 线性查找和二分法查找对比
线性查找:
- 优点:通用性更强
- 缺点:效率低,时间复杂度为:O(N)
二分法查找:
- 优点:效率高,时间复杂度为:O(logN)
- 缺点:数组必须有序
上一篇: 如何在vue3中实现动态路由
下一篇: Java|实现二分查找