12 数据结构与算法之查找算法

本文详细介绍了Java中常见的四种查找算法:顺序查找、二分查找、插值查找和斐波那契查找。顺序查找适用于小规模或无序序列;二分查找要求序列有序,查找效率高;插值查找根据目标值与数组边界的比例确定查找位置;斐波那契查找利用斐波那契数列特性优化查找过程。每种算法都提供了代码实现,便于理解与应用。
摘要由CSDN通过智能技术生成

查找算法

Java 中,我们常用的查找有四种:

  • 顺序 / 线性查找
  • 二分查找 / 折半查找
  • 插值查找
  • 斐波那契查找

线性查找算法

按顺序与序列中的值一一比对即可。

代码实现:

package com.atguigu.search;

public class SeqSearch {
    public static void main(String[] args) {
        int[] arr = {1, 9, 11, -1, 34, 89};
        int value = 89;
        int index = seqSearch(arr, value);
        if(index == -1) {
            System.out.println("没有找到您想要的值");
        } else {
            System.out.printf("%d这个值在%d号位置", value, index);
        }
    }

    // 找到一个满足条件的值就返回。
    public static int seqSearch(int[] arr, int value) {
        for(int i = 0; i < arr.length; i++) {
            if(arr[i] == value) {
                return i;
            }
        }
        return -1;
    }
}

二分查找

二分查找的序列必须是有序序列,每次可缩小一般范围,效率高。

思路分析:

  1. 首先确定该数组的中间下标
    mid = (left + right) / 2

  2. 然后让需要查找的数 finalVal 和 arr[mid] 比较
    如果finalVal > arr[mid] 则继续在数组的右边去找
    如果finalVal < arr[mid] 则继续在数组的左边去找
    如果finalVal = arr[mid] 找到了,停止查找

代码实现:

public static int binarySearch(int[] arr, int value) {
    int left = 0;
    int right = arr.length-1;
    while(left <= right) {
        int mid = (left + right) / 2;
        if(value > arr[mid]) {
            left = mid + 1;
        } else if(value < arr[mid]) {
            right = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}

public static int binarySearch2(int[] arr, int left, int right, int value) {
    if(left > right) {
        return -1;
    } else {
        int mid = (left + right) / 2;
        if(value > arr[mid]) {
            return binarySearch2(arr, mid+1, right, value);
        } else if(value < arr[mid]) {
            return binarySearch2(arr, left, mid-1, value);
        } else {
            return mid;
        }
    }
}

插值查找:

插值查找原理介绍:

  1. 插值查找算法类似于二分查找,不同的是插值每次从自适应 mid 处开始查找。
  2. 更换折半查找的公式:
    在这里插入图片描述
  3. 基本思想是按比例确定 mid 的位置,也可以称为是自适应确定 mid 值。

代码实现:

public static int insertSearch(int[] arr, int key) {
    int left = 0;
    int right = arr.length - 1;
    while(left <= right && key <= arr[left] && key >= arr[right]) {  //限定key值,防止数组越界!!
        int mid = left + (right - left) * (key - arr[left]) / (arr[right] - arr[left]);
        if(arr[mid] > key) {
            right = mid - 1;
        } else if(arr[mid] < key) {
            left = mid + 1;
        } else {
            return mid;
        }
    }
    return -1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值