当前位置: 首页 > article >正文

数据结构与算法之美代码:二分查找2

目录

  • 二分查找的变形问题
  • 代码

二分查找的变形问题

在这里插入图片描述

代码

package com.athome.search;

public class BinarySearchDemo {
    public static void main(String[] args) {
        int[] arr ={1,3,4,5,6,8,8,8,11,18};
        int index1 = bsearch1(arr, arr.length, 8);
        int index2 = bsearch2(arr, arr.length, 8);
        int index3 = bsearch1(arr, arr.length, 11);
        int index4 = bsearch1(arr, arr.length, 6);
        System.out.println(index1);
        System.out.println(index2);
        System.out.println(index3);
        System.out.println(index4);


    }

    //变体一:查找第一个值等于给定值的元素
    public static int bsearch1(int[] a, int n, int value) {
        int low = 0;
        int high = n - 1;
        while (low <= high) {
            int mid =  low + ((high - low) >> 1);
            if (a[mid] > value) {
                high = mid - 1;
            } else if (a[mid] < value) {
                low = mid + 1;
            } else {
                if ((mid == 0) || (a[mid - 1] != value)) return mid;
                else high = mid - 1;
            }
        }
        return -1;
    }

    //变体二:查找最后一个值等于给定值的元素
    public static int bsearch2(int[] a, int n, int value) {
        int low = 0;
        int high = n - 1;
        while (low <= high) {
            int mid =  low + ((high - low) >> 1);
            if (a[mid] > value) {
                high = mid - 1;
            } else if (a[mid] < value) {
                low = mid + 1;
            } else {
                if ((mid == n - 1) || (a[mid + 1] != value)) return mid;
                else low = mid + 1;
            }
        }
        return -1;
    }


    //变体三:查找第一个大于等于给定值的元素
    public static  int bsearch3(int[] a, int n, int value) {
        int low = 0;
        int high = n - 1;
        while (low <= high) {
            int mid =  low + ((high - low) >> 1);
            if (a[mid] >= value) {
                if ((mid == 0) || (a[mid - 1] < value)) return mid;
                else high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return -1;
    }


    //变体四:查找最后一个小于等于给定值的元素
    public static int bsearch4(int[] a, int n, int value) {
        int low = 0;
        int high = n - 1;
        while (low <= high) {
            int mid =  low + ((high - low) >> 1);
            if (a[mid] > value) {
                high = mid - 1;
            } else {
                if ((mid == n - 1) || (a[mid + 1] > value)) return mid;
                else low = mid + 1;
            }
        }
        return -1;
    }



}


http://www.kler.cn/a/147912.html

相关文章:

  • 自动化工具 Gulp
  • MySQL —— MySQL逻辑架构与查询过程
  • docker更改数据目录
  • Gartner发布安全平台创新洞察:安全平台需具备的11项常见服务
  • 认识一下Unicorn
  • C++中的栈(Stack)和堆(Heap)
  • 分享几个可以免费使用GPT的网站
  • docker常见问题汇总
  • 建筑木模板厂家批发
  • Linux fork笔试练习题
  • C++STL——string类详解及其模拟实现
  • 【深度学习】学习率及多种选择策略
  • 前端学习网站推荐
  • c/c++ header_only 头文件实现的关键点
  • Spring加载Bean的多种方式
  • 红旗Asianux Server Linux V8 安装万里数据库(GreatSQL)
  • Spring Cloud,注册中心,配置中心,原理详解
  • 社区新零售:重塑零售业的全新模式
  • 使用Python+Redis实现文章投票网站后端功能
  • 【文献阅读笔记】关于GANomaly的异常检测方法
  • 【开源威胁情报挖掘1】引言 + 开源威胁情报挖掘框架 + 开源威胁情报采集与识别提取
  • C#,《小白学程序》第十九课:随机数(Random)第六,随机生成任意长度的大数(BigInteger)
  • PTA:百钱买百鸡 - C/C++ 数组及字符串
  • Vue组件的自定义事件$emit
  • ArcGIS10.x系列 Python工具箱教程
  • TypeScript和JavaScript有什么不同