爪哇国新游记之二十七----数组的二分查找

简介:

代码:

复制代码
import java.util.ArrayList;
import java.util.List;

public class Bit {
    int max;
    int min;
    int[] arr;

    public Bit(int[] arrInput) {
        // 找出极值
        for (int i = 0; i < arrInput.length; i++) {
            if (max < arrInput[i]) {
                max = arrInput[i];
            }
            if (min > arrInput[i]) {
                min = arrInput[i];
            }
        }

        // 新建数组
        arr = new int[max - min + 1];

        // 数组插值
        for (int i : arrInput) {
            int index = i - min;
            arr[index]++;
        }
    }

    public boolean hasDuplicateItem() {
        for (int i = 0; i < arr.length; i++) {
            int value = arr[i];

            if (value > 1) {
                return true;
            }
        }

        return false;
    }

    public List<Integer> getSortedList() {
        List<Integer> ls = new ArrayList<Integer>();

        for (int i = 0; i < arr.length; i++) {
            int value = arr[i];

            if (value != 0) {
                for (int j = 0; j < value; j++) {
                    ls.add(min + i);
                }
            }
        }

        return ls;
    }

    public List<Integer> getUniqueSortedList() {
        List<Integer> ls = new ArrayList<Integer>();

        for (int i = 0; i < arr.length; i++) {
            int value = arr[i];

            if (value != 0) {
                ls.add(min + i);
            }
        }

        return ls;
    }
    
    public int[] getUniqueSortedArray(){
        List<Integer> ls=getUniqueSortedList();
        
        int[] arr=new int[ls.size()];
        
        for(int i=0;i<arr.length;i++){
            arr[i]=ls.get(i);
        }
        
        return arr;
    }

    /**
     * 二分查找
     * 
     * @param sortedArray
     *            已排序的欲查找的数组
     * @param seachValue
     *            查找的值
     * @return 找到的元素下标,若找不到则返回-1
     */
    public static int binSearch(int[] sortedArray, int seachValue) {
        // 左边界
        int leftBound = 0;
        // 右边界
        int rightBound = sortedArray.length - 1;
        // 当前下标位置
        int curr;

        while (true) {
            // 定位在左边界和右边界中间
            curr = (leftBound + rightBound) / 2;

            if (sortedArray[curr] == seachValue) {
                // 找到值
                return curr;
            } else if (leftBound > rightBound) {
                // 左边界大于右边界,已经找不到值
                return -1;
            } else {
                if (sortedArray[curr] < seachValue) {
                    // 当当前下标对应的值小于查找的值时,缩短左边界
                    leftBound = curr + 1;
                } else {
                    // 当当前下标对应的值大于查找的值时,缩短右边界
                    rightBound = curr - 1;
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = { -2, -1, 3, 5, 7, 9, 30, 4, -2, 5, 8, 3 };
        Bit b = new Bit(arr);

        System.out.println("排序后数组");
        int[] arr2=b.getUniqueSortedArray();
        for(int i=0;i<arr2.length;i++){
            System.out.println(i+":"+arr2[i]);
        }
        
        int[] arr3={2,5,7,-2,90};
        
        for(int i=0;i<arr3.length;i++){
            int index=Bit.binSearch(arr2, arr3[i]);
            if(index!=-1){
                System.out.println(arr3[i]+"排在数组arr2的第"+index+"个");
            }else{
                System.out.println(arr3[i]+"不在数组arr2中");
            }
        }
    }
}
复制代码

输出:

复制代码
排序后数组
0:-2
1:-1
2:3
3:4
4:5
5:7
6:8
7:9
8:30
2不在数组arr2中
5排在数组arr2的第4个
7排在数组arr2的第5个
-2排在数组arr2的第0个
90不在数组arr2中
复制代码

 













本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/xiandedanteng/p/3888410.html,如需转载请自行联系原作者


相关文章
|
7月前
|
数据采集 监控 API
淘宝淘口令 API 接口全攻略
### 淘口令 API 及相关服务简介 **一、淘口令 API(item_password)** - **功能**:将淘口令转换为商品链接或获取商品信息,支持生成自定义淘口令。 - **申请流程**:注册账号、创建应用、获取凭证、申请权限。 - **调用示例(Python)**:通过签名和请求参数调用接口,生成淘口令。 **二、第三方 API 服务** - **适用场景**:简化开发流程,支持高佣转链、淘口令解析等功能。 - **推荐接口**:万能淘口令生成、淘口令解析真实 URL。
|
7月前
WLAN AutoConfig 启动报错“错误 1068:依赖服务或组无法启动“
启动计算机时发现网络图标异常且WiFi图标消失,尝试启动WLAN AutoConfig服务时出现报错。解决步骤包括:1. 打开注册表并检查Ndisuio参数;2. 修改DisplayName和Start值;3. 以管理员身份打开命令提示符,输入`netsh winsock reset`重置Winsock目录。完成后重启计算机并重新启动WLAN AutoConfig服务即可恢复正常网络功能。
464 1
|
12月前
|
人工智能 弹性计算 机器人
如何在阿里云一键部署FlowiseAI
FlowiseAI 是一款开源低代码开发工具,专为构建定制化的语言学习模型(LLM)应用设计。用户可通过拖放界面轻松创建和管理AI驱动的应用,如聊天机器人和数据分析工具。它基于LangChain框架,支持多种AI模型和数据库集成,实现高度定制化的流程自动化。在阿里云上,可以通过一键部署链接快速部署FlowiseAI,并通过简单的几步配置开始使用。详细操作步骤包括创建ECS实例、获取登录信息等。更多细节可见FlowiseAI官网。
|
机器学习/深度学习 算法 人机交互
|
11月前
|
机器学习/深度学习 自然语言处理 TensorFlow
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第26天】在这篇文章中,我们将深入探讨卷积神经网络(CNN)的基本原理、结构和应用。CNN是深度学习领域的一个重要分支,广泛应用于图像识别、语音处理等领域。我们将通过代码示例和实际应用案例,帮助读者更好地理解CNN的概念和应用。
|
存储 分布式计算 定位技术
高德地图与阿里云MaxCompute:构建智慧出行的数据引擎
通过与阿里云MaxCompute的紧密结合,高德地图成功构建了一个高效、稳定的大数据处理平台,实现了从数据采集到价值输出的全过程自动化。这不仅提升了数据处理效率,还极大地改善了用户体验,为智慧出行的发展奠定了坚实的基础。随着技术的不断进步,未来高德地图还将探索更多创新的应用场景,持续推动地图服务向智能化方向演进。
|
存储 Python
数据类型:计算机科学中的基石
在计算机科学中,数据类型是程序设计的基本组成部分,它决定了如何在计算机内存中存储数据,以及如何对这些数据进行操作。不同的数据类型有不同的存储需求、取值范围以及可进行的操作。了解并正确使用数据类型是编写高效、健壮程序的关键。
329 0
|
物联网 语音技术 Swift
魔搭社区LLM模型部署实践, 以ChatGLM3为例(二)
魔搭社区LLM模型部署实践, 以ChatGLM3为例(二)
584 1
|
存储 前端开发 JavaScript
前端面试:如何实现并发请求数量控制?
前端面试:如何实现并发请求数量控制?
446 0
|
消息中间件 Java 关系型数据库
线上远程京东技术三面+HR面,五月中旬成功就职京东,月薪30K
由于今年的疫情影响,很多互联网大厂公司都采用线上远程面试的方法来挑选人才,很多幸运的小伙伴也是已经拿到大厂的offer了,今天给大家分享的是我之前公司同事拿到京东offer的朋友的面试经历,疫情虽然已经好转,但是还有很多朋友是在线上办公的,然后我去问到了我这个朋友京东面试的一些真题,以及我整理的一些真题分享给大家,希望可以还在找工作的伙伴提供到帮助,同时也祝大家都能收获自己的心仪 “offer” 吧!