java 二分查找法

  1. package zxx.New;

  2. import java.util.Arrays;

  3. /**
  4.  * 二分查找法
  5.  * 参数 sourceInt,targetStr
  6.  * 效率:
  7.  * max(count)<=log2(n+1)+1
  8.  * @author zhaoxin
  9.  * @version 1.0
  10.  */
  11. public class HalfBinarySearch {
  12.     static int max=0;
  13.     static int min=0;
  14.     static int half=0;
  15.     static int count=0;
  16.     //隐藏构造方法
  17.     private HalfBinarySearch(){
  18.     
  19.     }
  20.     
  21.     /**
  22.      * int[]类型匹配,返回与targetStr等值sourceInt[]数组下标
  23.      * @param sourceInt
  24.      * @param targetStr
  25.      * @return
  26.      */
  27.     public static int search(int[] sourceInt,Integer targetStr){
  28.     if(!init(sourceInt,targetStr)){
  29.         return -1;
  30.     }else{
  31.         return subSearch(sourceInt,targetStr,0,sourceInt.length);
  32.     }
  33.     }

  34.     /**
  35.      * 递归方式实现查找细节
  36.      * 待改进:
  37.      *    数组中具有相同大小的数时处理方式
  38.      * @param sourceInt
  39.      * @param targetStr
  40.      * @param min
  41.      * @param max
  42.      */
  43.     private static Integer subSearch(int[] sourceInts,Integer targetInt,int minNum,int maxNum){
  44.     count++;
  45.     max=maxNum;
  46.     min=minNum;
  47.     half=(max+min)/2;
  48.     if(sourceInts[half]==targetInt){
  49.         return half;
  50.     }
  51.     else if(min==max || half==max || half==min){
  52.         return -1;
  53.     }
  54.     else if(sourceInts[half]>targetInt){
  55.         return subSearch(sourceInts,targetInt,min,half);
  56.     }
  57.     else{
  58.         return subSearch(sourceInts,targetInt,half,max);
  59.     }
  60.     }
  61.     
  62.     /**
  63.      * 先决执行
  64.      * 1.排序
  65.      * 2.初判断
  66.      * @param sourceInt
  67.      * @param targetStr
  68.      * @return false:不存在符合要求的数
  69.      */
  70.     private static boolean init(int[] sourceInt,Integer targetStr){
  71.     boolean flag=false;
  72.     //产生递增序列
  73.     Arrays.sort(sourceInt);
  74.     if(sourceInt[0]>targetStr){
  75.         System.out.println("不存在符合要求的数,因为过小");
  76.     }
  77.     else if(sourceInt[sourceInt.length-1]<targetStr){
  78.         System.out.println("不存在符合要求的数,因为过大");
  79.     }
  80.     else{
  81.         flag=true;
  82.     }
  83.     return flag;
  84.     }
  85.     
  86.     /**
  87.      * max(count)<=log2(n+1)+1
  88.      * @param args
  89.      */
  90.     public static void main(String[] args){
  91.     int searcher=9999;
  92.     int[] is=new int[10000];
  93.     Long time1=System.currentTimeMillis();
  94.     for(int i=0;i<is.length;i++){
  95.         is[i]=i;
  96.         System.out.println(is[i]);
  97.     }
  98.     Long time2=System.currentTimeMillis();
  99.     
  100.     int num=search(is,searcher);
  101.     
  102.     Long time3=System.currentTimeMillis();
  103.     System.out.println("下标:"+num);
  104.         System.out.println("查询次数"+count);
  105.         System.out.println("初始时间"+(time2-time1));
  106.         System.out.println("查询时间"+(time3-time2));
  107.         System.out.println("num:"+is[num]);
  108.         Long time4=System.currentTimeMillis();
  109.         for(int i=0;i<is.length;i++){
  110.             if(is[i]==searcher){
  111.             break;
  112.             }
  113.         }
  114.         Long time5=System.currentTimeMillis();
  115.         System.out.println("遍历时间"+(time5-time4));
  116.     }
  117. }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值