数据结构算法学习day3——二分查找

一.算法描述

二.算法实现

java 复制代码
package com.algorithm.binarysearch;

public class BinarySearch {
    /*params:a - 待查找的升序数组
             target - 待查找的目标值
      Returns:
            找到则返回索引
            找不到则返回-1
    * */
    public static int binarySearch(int[] a,int target){//设置元素个数数组和待查找的目标值
        int i = 0,j = a.length - 1;//设置指针和初值
        while(i<=j){
            int m = (i+j) >>> 1; //用无符号右移运算符,防止溢出
            if(target < a[m]){//目标值在中间值左边的情况下
                j = m - 1;
            }else if(target >a[m]){//目标值在中间值右边的情况下
                i = m + 1;
            }else {
                return m; //找到中间值
            }
        }
        return -1;//找不到的情况下返回-1
    }
}
java 复制代码
package com.algorithm.binarysearch;

public class BinarySearch {
    /*params:a - 待查找的升序数组
             target - 待查找的目标值
      Returns:
            找到则返回索引
            找不到则返回-1
    * */
    public static int binarySearch(int[] a,int target){//设置元素个数数组和待查找的目标值
        int i = 0,j = a.length;//设置指针和初值
        while(i<j){
            int m = (i+j) >>> 1; //用无符号右移运算符,防止溢出
            if(target < a[m]){//目标值在中间值左边的情况下
                j = m;
            }else if(target >a[m]){//目标值在中间值右边的情况下
                i = m + 1;
            }else {
                return m; //找到中间值
            }
        }
        return -1;//找不到的情况下返回-1
    }
}

三.查找问题

问题一

**q:**为什么是i<=j意味着区间内有未比较元素,而不是i<j?

**s:**i,j 它们指向的元素也会参与比较。

问题二

q:(i+j)/2有没有问题?

**s:**同一个二进制数,在java中会把第一位看作符号位,所以用">>>"无符号右移运算符,防止溢出。

问题三

**q:**在比较中写成"<"小于符号有何好处?

**s:**数组是升序排列的,写成小于符号可以是和数组升序排列方向一致,不然会很别扭。

四.如何判断算法好坏

1.时间复杂度

含义:是用来衡量一个算法的执行,随数据规模增大,而增长的时间成本。

2.如何表示时间复杂度

假设算法要处理的数据规模是n,代码总的执行行数用函数f(n)来表示,例如:

  • 线性查找算法的函数f(n) = 3*n+3
  • 二分查找算法的函数f(n) = (floor(log2(n)+1)*5+4

渐进上界:代表算法执行的最差情况

渐进下界:代表算法执行的最好情况

渐进紧界:既能代表算法执行的最好情况,也能代表算法执行的最差情况

3.常见的大O表示法

4.空间复杂度

与时间复杂度类似,一般也是用大O表示法来衡量:一个算法执行随数据规模增大,而增长的额外空间成本。

5.二分查找性能

五.插入数组

将数组中没有的元素插入进去

六.寻找最侧边元素

1.寻找最左侧元素

java 复制代码
package com.algorithm.binarysearch;

public class BinarySearch {
    /*params:a - 待查找的升序数组
             target - 待查找的目标值
      Returns:
            找到则返回索引
            找不到则返回-1
    * */
    public static int binarySearch(int[] a,int target){
        int i = 0,j = a.length - 1;
        int candidate = -1//表示没有任何候选者
        while(i<=j){
            int m = (i+j) >>> 1; 
            if(target < a[m]){
                j = m - 1;
            }else if(target >a[m]){
                i = m + 1;
            }else {
                //记录侯选位置
                condidate = m;
                j = m - 1;
            }
        }
        return -1;
}

2.寻找最右侧元素

java 复制代码
package com.algorithm.binarysearch;

public class BinarySearch {
    /*params:a - 待查找的升序数组
             target - 待查找的目标值
      Returns:
            找到则返回索引
            找不到则返回-1
    * */
    public static int binarySearch(int[] a,int target){
        int i = 0,j = a.length - 1;
        int candidate = -1//表示没有任何候选者
        while(i<=j){
            int m = (i+j) >>> 1; 
            if(target < a[m]){
                j = m - 1;
            }else if(target >a[m]){
                i = m + 1;
            }else {
                //记录侯选位置
                condidate = m;
                i = m + 1;
            }
        }
        return condidate;
}
相关推荐
Pniubi2 分钟前
力扣3无重复字符的最长字串(滑动窗口)
算法·leetcode·职场和发展
tealcwu4 分钟前
【Unity基础】为什么游戏需要物理按键映射?从 Unity Input Manager 到跨引擎输入设计
java·游戏·unity
坤坤子吖5 分钟前
Linux网络编程:UDP进阶,从字典服务器到简单聊天室
linux·服务器·网络·c++·笔记·学习
On The Road :12 分钟前
深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析
jvm·算法
Rabitebla16 分钟前
【Linux学习笔记】进程篇(九):进程的创建与退出——fork、写时拷贝与退出码
linux·c++·笔记·学习
vipxieliang18 分钟前
Spring Boot 性能优化实战:从启动加速到运行时调优
java·spring boot
AI全栈学习助手32 分钟前
告别“转圈等待”:Spring Boot + SSE 让大模型像 ChatGPT 一样流式输出
java·人工智能·spring boot·后端·aigc
天天被压力32 分钟前
【A股分钟级高频数据完全手册 #02】Python调用股票1分钟数据接口:Pro版最新分时取数与字段解析
java·人工智能·python
代码不停33 分钟前
Spring Aop
java·数据库·spring
楚山之石35 分钟前
【MRM】CAPLEX 对比剂灌注 MRI 开源术语库:ISMRM OSIPI 共识报告
图像处理·人工智能·学习·mri