一、概念

二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法。

二、算法思想

搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

三、优缺点

二分查找算法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,二分查找算法适用于不经常变动而查找频繁的有序列表。

四、复杂度分析

(1) 时间复杂度

二分查找每次把搜索区域减少一半,时间复杂度为O(log(n));

(2)空间复杂度

O(1)

 package lsg.ap.binarysearch;
 import java.util.Arrays;
 public class BinarySearch
 {
     /**
      * 功能:二分法查找的一般实现方法
      *@author: 梁山广
      * 2016年4月11日下午6:32:30
      * @param array
      * @param target
      * @return
      */
     public static int binarySearch(int[] array,int target)
     {
         int bottem=1;
         int top=array.length;
         while(bottem<=top)
         {
             int middle=(bottem+top)/2;
             if(target>array[middle])
             {
                 bottem=middle+1;
             }
             else if(target<array[middle])
             {
                 top=middle-1;
             }
             else
             {
                 return middle;//找到指定元素后返回其下标
             }
         }
         return -1;//找不到就返回-1
     }
     /**
      * 功能:递归法实现二分查找
      *@author: 梁山广
      * 2016年4月11日下午6:34:58
      * @param array
      * @param targrt
      */
     public static int BinarySearchRecursive(int[] array,int bottem,int top,int target)
     {
         while(bottem<=top)//防止溢出
         {
             int middle=(bottem+top)/2;
             if(target>array[middle])
             {
                 return BinarySearchRecursive(array,middle+1,top,target);
             }
             else if(target<array[middle])
             {
                 return BinarySearchRecursive(array,bottem,middle,target);
             }
             else
             {
                 return middle;
             }
         }
         return -1;
     }
     /**
      * 递归二分法查找到的最终封装
      */
     public static int  binarySearchRecursive(int[] array,int target)
     {
         int index=BinarySearchRecursive(array,1,array.length,target);
         return index;
     }
      /**
      *
      * 输出相应数组的结果
      * @param array
      */
     private static void printArray(int[] array)
     {
        for(int value:array)
         System.out.print(" "+value+" ");
       System.out.println();
     }
     public static void main(String[] args)
     {
         int[] array=new int[]{8,3,2,1,7,4,6,5};
         System.out.println("原始数组为:");
         printArray(array);
         Arrays.sort(array);
         System.out.println("排序之后数组为:");
         printArray(array);
         System.out.println("待查找元素的下标为:");
         System.out.println(binarySearchRecursive(array,5));

     }

 }

Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)的更多相关文章

  1. java基础之二分法查找

    package p1; import java.util.*; public class Sortdob { public static void BubbleSort(int[] arr) {    ...

  2. java基础50道编程题

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...

  3. JAVA基础50题

    package package0530; import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;imp ...

  4. Java冒泡排序与二分法查找的代码随笔

    package javafirst; import java.util.Arrays; class MaoPao{ //升序排列 /** * @param arr 要排序的数组 * @return i ...

  5. Java中数组二分法查找

    算法:当数组的数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序.冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找. 基本思想:假设数据是按升序排序 ...

  6. java数组之二分法查找

    认识: 猜字游戏 步数 所猜的数 结果 可能值的范围 0     1~100 1 50 太高 1~49 2 25 太低 26~49 3 37 太高 26~36 4 31 太低 32~36 5 34 太 ...

  7. java基础---数组的查找算法(2)

    一.查找的基本概念 查找分为有序查找和无序查找,这里均以数组为对象,有序查找指的是数组元素有序排列,无序查找指的是数组元素有序或无序排列 平均查找长度(Average Search Length,AS ...

  8. java基础知识回顾之javaIO类--File类应用:递归深度遍历文件

    代码如下: package com.lp.ecjtu.File.FileDeepList; import java.io.File; public class FileDeepList { /** * ...

  9. Java基础知识强化之IO流笔记15:递归之删除带内容的目录案例

    1. 需求:递归删除带内容的目录 分析:   (1)封装目录   (2)获取该目录下的所有文件或者文件夹的File数组   (3)遍历该File数组,得到每一个File对象   (4)判断该File对 ...

随机推荐

  1. EBS 资源路径

    /data03/DEV4/comn/java/cmcc/upload cd  $OA_HTML /data03/DEV4/comn/html 日志 $IAS_ORACLE_HOME/Apache/Js ...

  2. arch框架人员、组织说明

    目前ERP辅助系统集成了三大模块功能,分别是财务辅助.物理辅助.报账平台. 财务辅助模块人员在ARCH_USER 表中进行管理,通过单独的[用户映射功能]将ARCH系统用户和ERP用户进行关联,关联信 ...

  3. JVM学习笔记

    1. JVM中的直接引用和符号引用 JVM在装载class文件的时候,会有一步是将符号引用解析为直接引用的过程. 那么这里的直接引用到底是什么呢? 对于指向“类型”[Class对象].类变量.类方法的 ...

  4. VirtualBox 使用技巧

    一.VirtualBox 的快捷键 VirtualBox 默认的 Host 键是 Right Ctrl Host 键可以点击 Oracle VM VirtualBox 管理器的左上角 “管理”-> ...

  5. iOS开发教程之:iPhone开发环境搭建

    安装条件: 硬件:一台拥有支持虚拟技术的64位双核处理器和2GB以上内存的PC. 注意:运行MAC OS,需要电脑支持虚拟技术(VT),安装时,需要将VT启动,在BIOS中开启. 软件: Window ...

  6. C# Socket编程 同步以及异步通信

    套接字简介:套接字最早是Unix的,window是借鉴过来的.TCP/IP协议族提供三种套接字:流式.数据报式.原始套接字.其中原始套接字允许对底层协议直接访问,一般用于检验新协议或者新设备问题,很少 ...

  7. JavaScript : 基本的处理事件

    JavaScript 事件参考手册:属性         当以下情况发生时,出现此事件onabort    图像加载被中断 onblur      元素失去焦点 onchange 用户改变域的内容 o ...

  8. Inside Kolla - 01 简介

    简介 在 opencloud 2015 的会议上初次了解到 kolla 项目后,开始去了解和学习 kolla 的源代码和相关的知识.经过一段时间的了解,觉得 kolla 确实是一个很好的项目,它使用预 ...

  9. 视差效果原理 background-attachment:fixed

    <html> <head> <style type="text/css"> body { background-image:url('http: ...

  10. 号外号外:9月13号《Speed-BI云平台案例实操--十分钟做报表》开讲了

    引言:如何快速分析纷繁复杂的数据?如何快速做出老板满意的报表?如何快速将Speed-BI云平台运用到实际场景中?         本课程将通过各行各业案例背景,将Speed-BI云平台运用到实际场景中 ...