• 【21天学习挑战赛】折半查找



    活动地址:CSDN21天学习挑战赛

    怕什么真理无穷,进一步有一份的欢喜。

    【21天学习挑战赛】折半查找

    ✌我为什么参与挑战赛

    1,机缘

    读到研一了,暑假假期打开私信发现这个挑战赛就鼓起勇气参加了。

    2,期待的收获

    A, 本人在华南理工大学攻读专硕,目前研究方向是图像恢复,从事深度学习相关工作,目标是从事Java后端开发。
    B, 期待您的反馈,如果有什么不对的地方,欢迎指正!
    C, 期待认识志同道合的领域同行或技术交流。
    如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦

    🍉什么是折半查找?

    折半查找的又称为二分查找,是一种效率相对较高的查找方法。使用该算法的前提要求是元素已经有序,如同名字一样,每次都是根据区间中心将元素分为左右半边,通过比较区间中心和要查找的元素的值,确定下次要查左半边还是右半边。

    在这里插入图片描述

    ✨折半查找的优劣

    优势

    时间复杂度为O(log2n),查找的速度较快,并且比较简单实现,通过判断来不断更新区间的左右端点值。

    劣势

    要求元素已经有序,这在大多数情况下不存在,且插入删除困难。

    🍵折半查找的步骤

    不断的重复取中间比较指定新的搜索区间这两个步骤,直到区间左右端点重合(代表搜素结束)或者找到元素为止。

    1. 与key相同:直接返回对应的位置
    2. 与key大:由于元素有序,要查找的元素一定在左侧(如有),于是搜素区间变为左一半
    3. 与key小:由于元素有序,要查找的元素一定在右侧(如有),于是搜素区间变为右一半

    ✍️ 算法实现

    public class BinarySearch {
    
        public static void main(String[] args) {
            // input data
            int[] a = {10, 11, 12, 14, 20, 32, 34, 35, 41, 43};
            int key = 11;
            // 调用算法,并输出结果
            int result = search(a, key);
            System.out.println(result);
        }
    
        private static int search(int[] nums, int target) {
            // 初始化变量
            int left = 0, right = nums.length - 1, mid = 0;
            // 循环终止条件为:左右端点发生交错
            while (left <= right) {
                mid = (left + right) >> 1;//除以2
                if (nums[mid] == target) {
                    return mid;
                } else if (nums[mid] < target) {
                    left = mid + 1;
                } else if (nums[mid] > target) {
                    right = mid - 1;
                }
            }
            // 循环结束还未触发内部的return则代表未找到,此时返回-1
            return -1;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    💎相关题目

    搜索插入位置
    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置
    请必须使用时间复杂度为 O(log n) 的算法。
    示例 1:
    输入: nums = [1,3,5,6], target = 5
    输出: 2
    示例 2:
    输入: nums = [1,3,5,6], target = 2
    输出: 1
    示例 3:
    输入: nums = [1,3,5,6], target = 7
    输出: 4
    提示:
    1 <= nums.length <= 104
    -104 <= nums[i] <= 104
    nums 为 无重复元素 的 升序 排列数组
    -104 <= target <= 104
    作者:力扣 (LeetCode)
    链接:https://leetcode.cn/leetbook/read/array-and-string/cxqdh/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    答案
    使用折半查找

    class Solution {
        public int searchInsert(int[] nums, int target) {
            // 折半查找
            int left = 0, right = nums.length - 1, mid = 0;
            while (left <= right) {
                // 防止 left+right 整型溢出
                mid = (left + right) >> 1;
                if (nums[mid] == target) {
                    return mid;
                } else if (nums[mid] < target) {
                    left = mid + 1;
                } else if (nums[mid] > target) {
                    right = mid - 1;
                }
            }
            return left;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    如果觉得对你有帮助的话:
    👍 点赞,你的认可是我创作的动力!
    ⭐️ 收藏,你的青睐是我努力的方向!
    ✏️ 评论,你的意见是我进步的财富!

    ​​

  • 相关阅读:
    Android AI语音之BNF语法
    linux中常用的文件处理命令
    【MySQL】21-MySQL之增删改
    【Flutter】Flutter 包管理(13)国际化 使用 intl 包处理 负数 性别 双向文本 复杂的日期和数字格式化
    读懂Json文件[妈妈再也不用担心我不读懂了]
    DETR:End-to-End Object Detection with Transformers
    Qt Example各例子功能说明(三)
    <wx-open-launch-weapp>微信公众号H5激活微信小程序躺坑日记
    Gradle新手指南
    多行多列按钮多选1
  • 原文地址:https://blog.csdn.net/qq_41080854/article/details/126227156