数组查找
- 1.线性查找(遍历查询)
- 2.二分查询
- 算法步骤
- 注意事项
- Java 代码示例
- 时间复杂度
1.线性查找(遍历查询)
就是完全遍历数组,寻找要找的元素
int [] arr = {10,6,8,9,2,3,};int num = 8;for(int i = 0;i<arr.length-1;i++){ //遍历数组if(arr[i]== num){System.out.println("寻找到了,下标为:"+i);}}
2.二分查询
二分法查找(Binary Search)是一种高效的查找算法,它只适用于有序数组。其基本思想是不断将数组分成两半并与目标值进行比较。具体步骤如下:
算法步骤
- 首先确定数组的中间位置
mid = (satrt + end) / 2
。 - 将
mid
位置的值与目标值比较:- 如果中间位置的值等于目标值,则查找成功,返回中间位置的索引。
- 如果中间位置的值小于目标值,则目标值必定在数组右半部分,因此将查找范围缩小为
mid + 1
到 end。 - 如果中间位置的值大于目标值,则目标值必定在数组左半部分,因此将查找范围缩小为 start 到
mid - 1
。
- 重复以上步骤,直到找到目标值或者查找范围为空(start > end),此时表示找不到目标值。
注意事项
- 二分法查找只适用于已排序的数组。
- 在计算中间位置时,如果 start 和 end 很大,直接相加可能会导致整数溢出。为了避免这个问题,可以使用
mid = start + (end - start) / 2
。
Java 代码示例
以下是使用二分法查找的Java代码示例:
import java.util.Arrays;
public class BinarySearch {public static void main(String[] args) {int[] arr = {2, 5, 8,23, 12, 16, 56, 72,38, 91};int target = 23;Arrays.sort(arr); //Arrays工具类,对数组进行排序int result = binarySearch(arr, target);if (result != -1) {System.out.println("目标值 " + target + " 在数组中的索引是 " + result);} else {System.out.println("数组中没有找到目标值 " + target);}}public static int binarySearch(int[] arr, int target) {int start = 0;int end = arr.length - 1;while (start <= end) {int mid = low + (end - start) / 2;if (arr[mid] == target) {return mid; // 找到目标值,返回索引} else if (arr[mid] < target) {start = mid + 1; // 目标值在右半部分} else {end = mid - 1; // 目标值在左半部分}}return -1; // 没有找到目标值}}
时间复杂度
- 最好情况:O(1)
- 最坏情况:O(log n)
- 平均情况:O(log n)
由于二分法查找每次查找都会将查找范围减半,所以它的时间复杂度是对数级的,这使得它非常高效,特别是对于大型数据集。