[javaSE] 数组(查找-二分查找)

前提数组必须是有序的

 

定义最小,最大,中间的角标索引

        int min,max,mid;
        min=0;
        max=arr.length-1;
        mid=(min+max)/2;

 

上面的索引需要变化,使用循环,条件:当中间值不等于目标值时

复制代码
        int min,max,mid;
        min=0;
        max=arr.length-1;
        mid=(min+max)/2;
        while(arr[mid]!=key){
            if(key<arr[mid]){
                
            }else if(arr[mid]<key){
                
            }
        }
复制代码

 

当中间值大于目标值时,最大角标移动到中间角标-1位置

当中间值小于目标值时,最小角标移动到中间角标+1位置

中间角标继续二分

复制代码
        int min,max,mid;
        min=0;
        max=arr.length-1;
        mid=(min+max)/2;
        while(arr[mid]!=key){
            if(key<arr[mid]){
                max=mid-1;
            }else if(arr[mid]<key){
                min=mid+1;
            }
            mid=(min+max)/2;
        }
        return mid;
复制代码

 

 

此时的代码有问题,当找不到目标时,会陷入死循环,加一个判断

如果一直找不到,最小角标和最大角标会错位

复制代码
        int min,max,mid;
        min=0;
        max=arr.length-1;
        mid=(min+max)/2;
        while(arr[mid]!=key){
            if(key<arr[mid]){
                max=mid-1;
            }else if(arr[mid]<key){
                min=mid+1;
            }
            if(min>max) return -1;
            mid=(min+max)/2;
        }
        return mid;
复制代码

java版:

复制代码
public class ArrayDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] arr=new int[]{1,4,6,7,8,9};
        System.out.println("索引:"+keySearch(arr,7));//索引:3
        System.out.println("索引:"+helfSearch(arr,7));//索引:3
    }
    /**
     * 二分查找
     * @param arr
     * @param key
     * @return
     */
    public static int helfSearch(int[] arr,int key){
        int min,max,mid;
        min=0;
        max=arr.length-1;
        mid=(min+max)/2;
        while(arr[mid]!=key){
            if(key<arr[mid]){
                max=mid-1;
            }else if(arr[mid]<key){
                min=mid+1;
            }
            if(min>max) return -1;
            mid=(min+max)/2;
        }
        return mid;
    }
    /**
     * 获取该值在数组中第一次出现的位置
     * @param arr
     * @param num
     * @return
     */
    public static int keySearch(int[] arr,int num){
        for(int i=0;i<arr.length;i++){
            if(arr[i]==num){
                return i;
            }
        }
        return -1;
    }
}
复制代码

PHP版:

复制代码
<?php
class ArrayDemo{
    public static function main(){
        $arr=array(1,4,6,7,8,9);
        echo "索引:".ArrayDemo::keySearch($arr,7);//索引:3
        echo "索引:".ArrayDemo::helfSearch($arr,7);//索引:3
    }
    /**
     * 二分查找
     * @param arr
     * @param key
     * @return
     */
    public static function helfSearch($arr,$key){
        $min=0;
        $max=count($arr)-1;
        $mid=ceil(($min+$max)/2);
        while($arr[$mid]!=$key){
            if($key<$arr[$mid]){
                $max=$mid-1;
            }else if($arr[$mid]<$key){
                $min=$mid+1;
            }
            $mid=ceil(($min+$max)/2);
            if($min>$max) return -1;
        }
        return $mid;
    }
    /**
     * 获取该值在数组中第一次出现的位置
     * @param arr
     * @param num
     * @return
     */
    public static function keySearch($arr,$key){
        for($i=0;$i<count($arr);$i++){
            if($arr[$i]==$key){
                return $i;
            }
        }
        return -1;
    }
}

ArrayDemo::main();
复制代码

 

posted @   唯一客服系统开发笔记  阅读(295)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
1
chat with us