问题: 现有数组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.声明一个引用保存要查找的值valueint value = 1;// 用于判断元素是否找到boolean flag = false;// 2.声明头部下标headIndex=0、尾部下标endIndex=arr.length-1int 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)
- 缺点:数组必须有序