黑马程序员——Java之二分查找算法

------------------- Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ---------------------


一、概念

二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法。请注意这种算法是建立在有序数组基础上的。

二、算法思想

1、搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;
2、如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
3、如果在某一步骤数组为空,则代表找不到。
这种搜索算法每一次比较都使搜索范围缩小一半。

三、优缺点

       二分查找算法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,二分查找算法适用于不经常变动而查找频繁的有序列表。

四、实现思路

1、找出位于数组中间的值,并存放在一个变量中(为了下面的说明,变量暂时命名为temp);
2、需要找到的key和temp进行比较;
3、如果key值大于temp,则把数组中间位置作为下一次计算的起点;重复1、2。
4、如果key值小于temp,则把数组中间位置作为下一次计算的终点;重复1、2、3。
5、如果key值等于temp,则返回数组下标,完成查找。

五、实现代码

public class BinarySearch {
      /**方式一:递归之二分查找;
      * @param dCount 获取递归的次数
      * @param xCount 获取循环的次数
      */
      private int dCount =0;
      private int xCount =0;
      public int getdCount(){
           return dCount ;
     }
      public int getxCount(){
           return xCount ;
     }
      /**
      * @param sortedArray 已排序的数组
      * @param start       开始位置
      * @param end         结束位置
      * @param findValue   要找的位置
      * @return             返回值所在数组的角标,找不到返回 - 1。
      */
      public int searchRecursive( int[] sortedArray, int start,int end,int findValue){
           dCount++;
           if (start<=end){
            int minddle=(start+end)>>1;//相当于(start+end)/2;
             int minddleValue=sortedArray[minddle];
             if (findValue==minddleValue)
               //如果查找的值与中间的值相同则直接返回中间值的角标。
                     return minddle;
             //如果查找的值小于中间的值则去前面部分查找。开始位置不变,结束位置为中间位置-1,再次递归。
             else if (findValue<minddle)
                  return searchRecursive(sortedArray,start,minddle-1,findValue);
             //如果查找的值大于中间的值则去后面部分查找。开始位置为中间值+1,结束位置不变,再次递归。
             else return searchRecursive(sortedArray,minddle+1,end,findValue);
          }
           else {
               return -1;//找不到值 返回-1;
          }
     }
      /**
      * 方式二:循环之二分查找;
      * @param sortedArray  已排序的数组
      * @param findValue    需要找的值
      * @param xCount       循环的次数
      * @return              循环查找值的角标,如果没有找到则返回 - 1;
      */
      public int sortedLoop( int[] sortedArray, int start,int end,int findValue){
           while (start<=end){
               xCount++;
               int minddle=(start+end)>>1;//相当于(start+end)/2;
              int minddleValue=sortedArray[minddle];
              if (findValue==minddleValue)
              return minddle;
              else if (findValue<minddleValue)
                     end=minddle-1;
              else    start =minddle+1;
                    }
           return -1;
     }
      public static void main(String[] args) {
           // TODO Auto-generated method stub
           int [] sortedArray={1,2,3,4,5,6,6,7,8,8,9,9,10,11};
           int findValue=1;
           int length=sortedArray.length ;
           int start=0;
           int end=length-1;
          BinarySearch bs= new BinarySearch();
           int pos1=bs.searchRecursive(sortedArray, start, end, findValue);
          System. err .println("要查找的" +findValue+ "的角标:"+pos1+ "递归次数:" +bs.dCount );
           int pos2=bs.sortedLoop(sortedArray, start, end, findValue);
          System. err .println("要查找的" +findValue+ "的角标:"+pos2+ "递归次数:" +bs.xCount );
     }
}


------------------- Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ---------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值