zoukankan      html  css  js  c++  java
  • 4.20Java二分法查找

    4.20Java二分法查找

    什么是二分法查找

    二分法检索(binary search)称折半检索

    二分法查找的基本思想

    前提:

    • 数组中的元素从小到大有序的存放在数组(array)中

    步骤:

    • 将给定值key与数组中间位置元素的关键码(key)比较

    • 如果相等,检索成功

    • key小,在数组前半段继续二分查找

    • key大,在数组后半段进行二分查找,直到索引成功

    对于有序数组而言,二分查找的效率是比较高的

    实例:

    package com.array;

    import java.util.Arrays;

    /**
    * 测试二分法查找,折半检索,通过值找索引
    * @author Lucifer
    */
    public class TestBinarySearch {
       public static void main(String[] args) {

           /*测试源数组*/
           int[] arr = {30,20,50,10,80,9,7,12,100,40,8};

           /*
           1.排序---不用冒泡排序,用工具类方法
           2.定义检索的范围---定义两个变量,起始位置、结束位置
            */
           Arrays.sort(arr);

           //要查找的值
    //       int value = 10;

           System.out.println(Arrays.toString(arr));
           System.out.println(myBinarySearch(arr,-1));

      }

       /*封装返回值*/
           /*
           传进来的值进行查找
           在arr数组中查找
           这样就定义了形参
            */
       public static int myBinarySearch(int[] arr, int value){

           /*测试二分查找*/

           //起始位置
           int low = 0;

           //结束位置
           int high = arr.length - 1; //最大索引值

           //循环条件
           while (low <= high){

               //定义中间索引值
               int mid = (low + high)/2;

               //相等说明找到了,直接返回值
               if (value == arr[mid]){
                   return mid;
              }

               //如果值比中间索引值要大,说明要从中间索引向后找,所以起始位置索引要变成中间索引值+1
               if (value > arr[mid]){
                   low = mid + 1;
              }

    //           //如果值比中间索引值小,说明要从中间索引向前找,所以起始位置索引要变成中间索引值-1
    //           if (value < arr[mid]){
    //               low = mid - 1;
    //           }

               //如果值比中间索引值小,说明要从中间索引向前找,所以起始位置索引要变成中间索引值-1
               if (value < arr[mid]){
                   high = mid - 1;
              }
               /*
               注意这里是high最大值发生变化不是最小值发生变化
               如果是写最小值low变化在进行到第三次while循环的时候
               从low到high的元素数量变成偶数,通过(low + high)/2取得的mid一直为8
               low就会始终为7
               所以程序会出现死循环,运行不下去
                */

          }
           //没有找到返回-1
           return -1;
      }
    }

     

     

     

    It's a lonely road!!!
  • 相关阅读:
    RedisTemplate实现事物问题剖析和解决
    PO BO VO DTO POJO DAO概念及其作用(附转换图)
    Java 应用程序设计规范
    Java web url 规范
    Java 中 Map与JavaBean实体类之间的相互转化
    使用Java 8中的Stream
    [转]http://lua-users.org/wiki/LpegTutorial
    [转]LUA元表
    LPEG
    [转]LUA 学习笔记
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14682614.html
Copyright © 2011-2022 走看看