• [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();
  • 相关阅读:
    丁夏畦同志去世
    [裴礼文数学分析中的典型问题与方法习题参考解答]4.5.7
    [数分提高]2014-2015-2第10教学周第2次课 (2015-05-07)
    [数分提高]2014-2015-2第10教学周第1次课 (2015-05-04)
    [数分提高]2014-2015-2第9教学周第2次课 (2015-04-30)
    [数分提高]2014-2015-2第9教学周第1次课 (2015-04-28)
    [数分提高]2014-2015-2第8教学周第2次课 (2015-04-23)
    2014年江西省青年科学家名单
    2014年“江西青年五四奖章”名单
    [数学杂志]AML
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5500491.html
Copyright © 2020-2023  润新知