• 几个二分法示例


    /**
     * 几个二分法
     * @author tiger
     */
    public class Test {

     /**
      * 中间调用多个自身方法
      */
     public void erFenFa(int[] array, int fromIndex, int toIndex, int goal){
      if(fromIndex > toIndex){ // 这一句非常重要!
       return;
      }
      int middle = (fromIndex + toIndex) / 2;
      if(array[middle] == goal){
       System.out.println(goal + "在数组中的索引是:" + middle);
       return;
      }else if(array[middle] < goal){
       erFenFa(array, middle+1, toIndex, goal);
      }else{
       erFenFa(array, fromIndex, middle-1, goal);
      }
     }
     
     /**
      * 中间调用多个自身方法
      * 将能打印出所有目标值所在索引
      *
      * 这其实和二叉树的遍历非常相像!!!
      * 这个方法的算法复杂度其实和线性的遍历一模一样!!!
      */
     public void erFenFa2(int[] array, int fromIndex, int toIndex, int goal){
      if(fromIndex > toIndex){ // 这一句非常重要!
       return;
      }
      int middle = (fromIndex + toIndex) / 2;
      if(array[middle] == goal){
       System.out.println(goal + "在数组中的索引是:" + middle);
      }
      erFenFa2(array, middle+1, toIndex, goal);
      erFenFa2(array, fromIndex, middle-1, goal);
     }
     
     
     /**
      * 一个循环搞定
      * 用循环的方法来实现二分法,似乎没有办法能够打印出所有的目标索引!
      * 试想下,假如数组中所有元素都是目标值,那怎么打印出所有呢??
      */
     public void erFenFa3(int[] array, int fromIndex, int toIndex, int goal){
      int middle = 0;
      while(fromIndex < toIndex)
      {
       middle = (fromIndex + toIndex) / 2;
       if(array[middle] == goal){
        System.out.println(goal + "在数组中的索引是:" + middle);
        return; //此句非常重要,如果没有,当数组中有目标值,程序能执行到这里时,
          //由于不会对fromIndex和toIndex造成变化,将会陷入死循环!!!
       }else if(array[middle] < goal){
        fromIndex = middle + 1;
       }else{
        toIndex = middle -1;
       }
      }
     }
     
     
     /**
      * 程序入口
      * @param args
      */
     public static void main(String[] args) {
      int[] tiger = {1,2,2,2,5,6,2,8};
      System.out.println("方法一:");
      new Test().erFenFa(tiger, 0, 7, 2);
      System.out.println("方法二:");
      new Test().erFenFa2(tiger, 0, 7, 2);
      System.out.println("方法三:");
      new Test().erFenFa3(tiger, 0, 7, 2);
     }
    }

    /*打印结果如下:
    方法一:
    2在数组中的索引是:3
    方法二:
    2在数组中的索引是:3
    2在数组中的索引是:6
    2在数组中的索引是:1
    2在数组中的索引是:2
    方法三:
    2在数组中的索引是:3*/

  • 相关阅读:
    微信开发创建公众号或小程序菜单45064: no permission to use weapp in menu rid:XXXXXXX
    大文件上传:秒传、断点续传、分片上传
    Linux 给文件夹或者文件增加权限
    常见的架构方式
    RabbitMQ集群
    常见的系统架构思想
    RabbitMQ问题分析
    RabbitMQ实战&管理界面
    Linux安装RabbitMQ
    Redis发布订阅及消息阻塞
  • 原文地址:https://www.cnblogs.com/chaohi/p/2330345.html
Copyright © 2020-2023  润新知