CT的算法学习(一):二分查找

《算法》是我学习算法的记录。

二分查找

概述

在有序数组中搜索特定值的过程。

二分查找中使用的术语:

  • 目标 Target —— 你要查找的值
  • 索引 Index —— 你要查找的当前位置
  • 左、右指示符 Left,Right —— 我们用来维持查找空间的指标
  • 中间指示符 Mid —— 我们用来应用条件来确定我们应该向左查找还是向右查找的索引

算法思想

二分法:二分法查找的思路如下:

(1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。

(2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。

(3)如果某一步数组为空,则表示找不到目标元素。

结构

一个典型的二分查找实例:

有一个有序数组{1,1,2,4,6,8,7,8},输入一个目标target=4,查找目标在该数组中的位置,返回位置;若无,则返回-1。

public class Solution {
    public static void main(String[] args) {
        //利用s来接受search的返回值
        int s= search(new int[]{1, 1, 2, 4, 6, 8, 7, 8},4);
        //打印返回值
        System.out.println(s);
    }

    public static int search(int[] nums, int target){
        //建立两个指针:一个为最左端,一个为最右端
        int left=0,right=nums.length-1;
        //当left<=right时,循环
        while(left<=right){
            //计算中间位置mid
            int mid=left+(right-left)/2;
            //if语句:当nums[mid]等于target时,则找到了数组中元素中值等于target的相应的角标mid
            if(target==nums[mid]){
                return mid;
            }
            //如果target小于,则使right指针指向mid-1的位置,进行下一次循环;
            //同理若target大于,则使left指针指向mid+1的位置。
            else if(target<nums[mid]){
                right=mid-1;
            }else{
                left=mid+1;
            }
        }
        //若循环结束仍未找到target,则返回负值。
        return -1;
    }
}

时间和空间复杂度

时间复杂度:O(log n)

我们的每一次所需查找的数量都是上一次的一半

空间复杂度:O(1) —常量空间

我们只需要额外建立三个常量:left、right、mid

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值