`
horizon0315
  • 浏览: 29805 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

二分搜索算法

阅读更多
/*
*  二分搜索算法用于针对已排序的集合进行搜索。

它的原理是:

1,  找到排序数组的中间元素,如果它匹配目标值,那么就返回它在数组中的索引。

2,  如果没有找到,那么判断中间值比目标值大还是小,

如果中间值比目标值大,那么就对第一个元素到middle-1的元素递归这个过程。

如果中间值比目标值小,那么就对middle+1到最后一个元素。

3,  如果结束的索引小于开始的索引,返回-1,表示没有找到。

4,  如果子集合有2个元素,那么各自比较。因为Java的整数除法会舍弃小数,如果数组只有2个元素,那么middle值一直都是第一个元素。

经过上述的递归过程,最终将返回匹配元素的索引,或者是-1,表示找不到。
*/
public class BinarySearh {
public static void main(String[] args){
int[] array = {13,27,38,49,65,76,97};
int n = sq_Dichotomy_Search(array,0,array.length-1,38);
System.out.println(n);
}


public static int binarySearh(int[] array,int start,int end,int value){
int middle = (start+end)/2;
if(start>end){
return -1;
}
if(start==(end-1)){
if(array[start]==value){
return start;
}else if(array[end]==value){
return end;
}else{
return -1;
}
}else if(array[middle]==value){
return middle;
}else if(array[middle]>value){
return binarySearh(array,start,middle,value);
}else if(array[middle]<value){
return binarySearh(array,middle,end,value);
}
return -1;
}
/*
*   有序数组二分查找算法函数sq_Dichotomy_Search0<用数组实现> 
     参数描述: 
         int array[]    :被查找数组 
         int n        :被查找数组元素个数 
         int key        :被查找的关键值 
     返回值: 
         如果没有找到:    sq_Dichotomy_Search0 = -1 
         否则:            sq_Dichotomy_Search0 = key数组下标 
*/
public static int binarySearh2(int array[],int start,int end,int key){  
     int low,high,mid;  
     low = start;  
     high = end;  
       
     while(low<=high){  
         mid = (high+low)/2;  
         if(array[mid] == key)  
             return(mid);  
         /**//*key>array[mid] 表明要求查找的值在[mid+1,high]*/ 
         /**//*否则,在[low,mid-1]*/ 
         if(key > array[mid])  
             low = mid + 1;  
         else 
             high = mid - 1;  
     }  
     return(-1);  
}

/**//* 
     有序数组插值查找算法函数sq_Dichotomy_Search1<用数组实现> 
     (插值查找算法是二分查找算法的改进) 
     参数描述: 
         int array[]    :被查找数组 
         int n        :被查找数组元素个数 
         int key        :被查找的关键值 
     返回值: 
         如果没有找到:    sq_Dichotomy_Search1 = -1 
         否则:            sq_Dichotomy_Search1 = key数组下标 
*/ 
  public static int sq_Dichotomy_Search(int array[],int start,int end,int key)   {  
      int low,high,        //二分数组的上,下标  
          pos;            //查找码的大致(估算)位置  
      low = 0;  
      high = end;  
      while(low <= high){  
          pos = (key-array[low])/(array[high]-array[low])*(high-low)+low;  
          /**//*找到关键值,中途退出*/ 
          if(key == array[pos])  
              return(pos);  
          if(key > array[pos])  
              low = pos + 1;  
          else 
              high = pos - 1;  
      }  
      /**//*没有找到,返回-1*/ 
      return(-1);  
  } 
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics