zoukankan      html  css  js  c++  java
  • [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();
  • 相关阅读:
    js数组与字符串的相互转换
    JS怎么把字符串数组转换成整型数组
    element-UI的操作步骤steps每一项添加事件,比如click,hover
    element-UI ,Table组件实现拖拽效果
    修改本机域名localhost为任意你想要的名称
    el-tree 设置目录树中的某个节点为高亮状态
    Akka-CQRS(2)- 安装部署cassandra cluster,ubuntu-16.04.1-LTS and MacOS mojave
    Akka-CQRS(1)- Write-side, Persisting event sources:CQRS存写端操作方式
    Akka-CQRS(0)- 基于akka-cluster的读写分离框架,构建gRPC移动应用后端架构
    Akka-Cluster(6)- Cluster-Sharding:集群分片,分布式交互程序核心方式
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5500491.html
Copyright © 2011-2022 走看看