二分查找

来源:互联网 发布:音乐播放器源码 编辑:程序博客网 时间:2024/06/14 01:44
二分查找的三种实现方法


二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。


java实现代码:

public class Test {public static void main(String[] args) {int[] arr = {1,2,3,4,5};System.out.println(binarySearch1(arr,5));System.out.println(binarySearch2(arr,5));System.out.println(binarySearch3(arr,5,0,arr.length-1));}/** * 二分查找 * @param srcArray 要查找的数组 * @param des  要查找的数字 * @return  元素下标 */public static int binarySearch1(int[] srcArray, int des){                 int low = 0;           int high = srcArray.length-1;           while(low <= high) {               int middle = (low + high)/2;               if(des == srcArray[middle]) {                   return middle;               }else if(des <srcArray[middle]) {                   high = middle - 1;               }else {                   low = middle + 1;               }          }          return -1;      }  /** * 二分查找 * @param srcArray 要查找的数组 * @param des  要查找的数字 * @return  元素下标 */public static int binarySearch2(int[] srcArray, int des) {    int low = 0;    int high = srcArray.length - 1;    while ((low <= high) && (low <= srcArray.length - 1) && (high <= srcArray.length - 1)){        int middle = low + ((high - low) >> 1);        if (des == srcArray[middle]) {            return middle;        }        else if(des < srcArray[middle]) {            high = middle - 1;        } else {            low = middle + 1;        }    }    return -1;}/** * 二分查找递归实现 * @param dataset  数组 * @param data 要查找的数 * @param beginIndex  初始递归为0 * @param endIndex  初始递归为dataset.length-1; * @return  返回下标 */public static int binarySearch3(int[] dataset,int data,int beginIndex,int endIndex){        int midIndex = (beginIndex+endIndex)/2;           if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){             return -1;           }         if(data <dataset[midIndex]){               return binarySearch3(dataset,data,beginIndex,midIndex-1);           }else if(data>dataset[midIndex]){               return binarySearch3(dataset,data,midIndex+1,endIndex);           }else {               return midIndex;           }    } }

444


原创粉丝点击