黑马程序员——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>1;//相当于(start+end)/2;
              int minddleValue=sortedArray[minddle];
              if (findValue==minddleValue)
              return minddle;
              else if (findValue


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

你可能感兴趣的:(Java学习笔记)