算法 经典的四种查找算法代码详解

本文详细解析了四种经典的查找算法:顺序查找、二分查找、插值查找和斐波那契查找。通过实例介绍了每种算法的基本思想、操作步骤和代码实现,并展示了查找过程和结果。这些查找算法适用于不同场景,对数据结构和算法的学习具有重要意义。
摘要由CSDN通过智能技术生成

顺序(线性)查找

简介

顺序查找适合于存储结构为顺序存储或链接存储的线性表

基本思想:顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。

时间复杂度:当查找不成功时,需要n+1次比较,时间复杂度为O(n);所以,顺序查找的时间复杂度为O(n)。

图解

img

题目要求

有一个数列:{1,8,20,23,34,45,3},如果找到,就提示找到,并给出下标值

代码实现

public class SeqSearch {
   
    public static void main(String[] args) {
   
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的值:");
        int value = scanner.nextInt();
        int[] arr={
   1,8,20,23,34,45,3};
        System.out.println("输出数组的值:");
        System.out.println(Arrays.toString(arr));
        int index = seqSearch(arr, value);
        if (index==-1) {
   
            System.out.println("没有找到该值!");
        }else{
   
            System.out.println("找到该值,下标为:"+index);
        }
    }

    /**
     * 线性查找是逐一比对,发现有相同值,就返回下标
     * 实现的线性查找到一个满足条件的值
     * @param arr
     * @param value
     * @return
     */
    public static int seqSearch(int[] arr,int value){
   
        for (int i = 0; i < arr.length; i++) {
   
            if (arr[i] == value) {
   
                return i;
            }
        }
        return -1;
    }
}

结果展示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DCtJZJf8-1640853369264)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211221200456451.png)]

二分查找/折半查找

简介

说明:元素必须是有序的,如果是无序的则要先进行排序操作。

基本思想:也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

复杂度分析:最坏情况下,关键词比较次数为log2(n+1),且期望时间复杂度为O(log2n);

题目要求

要求

请对一个有序数组进行二分查找{1, 5, 7, 10, 324, 2345},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示“没有这个数”

思考

当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的1212.

思路分析

简单思路分析

1.首先确定该数组的中间的下标

mid=(left+right)/2

2.然后让需要查找的数findVal和arr[mid]比较

2.1findVal>arr[mid],说明你要查找的数再mid的右边,因此需要递归的向左查找

2.3findVal==arr[mid]说明找到,就返回

什么时候需要结束递归

1)找到就结束递归

2)递归完整个数组,仍然没有找到findVal,也需要结束递归,当left>right就需要退出

图解

img

思考思路分析

1.在找到mid索引值,不要马上返回

2.向mid索引值的左边扫描,将所有满足1000的元素的下标加入到集合ArrayList中

3.向mid索引值的右边扫描,将所有满足1000的元素的下标,加入到集合Array List中

4.最后将集合返回

代码展示

public class BinarySearch {
   
    public static void main(String[] args) {
   
        int arr[] = {
   1, 5, 7, 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抹泪的知更鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值