如何使用折半查找

 

public class _05折半查找 {

 

    public static void main(String[] args) {

 

 

       int[] arr1={3,2,1,5,4,9};

       int index = getIndex(arr1,4);

      

       //使用折半查找

       int[] arr2={3,5,49,57,77,99,101};

       int index2 = halfSerch(arr2,45);

       System.out.println("index="+index);

       System.out.print("index="+index2);

    }

   

    //使用折半方法查找:可以提高效率,但必须是有序数组

    //思路:1.是否有返回值(有)2.方法的参数类型及个数

    //3.定义折半查找的条件:最小角标值,最大角标值,中间值

    //4.判断条件:所查找的数是否存在

   

    public static int halfSerch(int[] arr2,int key)//key代表要查找的数值

    {

       int min,max,mid;

       min=0;//最小角标,即从0开始

       max=arr2.length-1;//获取最大数的角标,即int[]arr {3,5,2,1}所在角标的数值

       mid=(min+max)/2;//取最小角标与最大角标的中间值

      

       //判断条件:即arr2[mid]中间值所在角标与所要找的数是否相等

       while(arr2[mid]!=key)

       {

           if(key>arr2[mid])

           {

              min = mid+1;//如果查找数比中间角标所在数的值大,最小角标将从当前角标值右移1

           }else if(key<arr2[mid])

              max = mid-1;//如果查找数比中间角标所在数的值小,最大角标将从当前角标值左移1

          

           if(min>max)//当最小角标大于最大角标时,即没有找到所查数

           {

              return -1;

           }

           mid = (min+max)/2;//如果上面判断条件成立,即重新定义中间角标值。

       }

      

       return mid;//如果以上条件都不成立,说明已经找着了,即将中间角标返回

    }

   

   

    /*

     * 折半的第二种方式

     */

    public static int Serch(int[] arr,int key)

    {

       int min=0,max=arr.length-1,mid;

       while(min<=max)

       {

           mid=(min+max)<<1;//相当于除2

           if(key>arr[mid])

              min = mid +1;//key大于中间值时,最小值往右,mid+1

           else if(key<arr[mid])

              max = mid-1;//key小于中间值时,最大值往左,mid1

           else

              return mid;//找着了

       }

       return -1;//没找着

    }

   

   

    //功能:获取key第一次出现在数组中的位置。如果返回值是-1,那么代表该key不存在

    //思想:1.该功能有没有返回值  (有)2.表达式类型,(数组和要查找的数)

   

    public static int getIndex(int[] arr1,int key)//key代表要查找的数值

    {

       for(int i=0;i<arr1.length;i++)

       {

           if(arr1[i]==key)

           {

              return i;

           }

       }

       return -1;

    }

 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值