转自http://blog.csdn.net/nzfxx/article/details/51615439

1.特点及概念介绍

  1. 下面给大家讲解一下"二分法查找"这个java基础查找算法,那么什么是二分法呢?其实所谓的"二分法",就是一分为二的意思,综合起来理解就是一分为二的查找,但大家记住了,二分法是建立在"已经按顺序排好"的基础条件上,如果大家把这个二分法查找理解清楚了,那么会有助于你更好的理解快速排序,下面我就罗列出该算法的特点:
  2.  
  3. 1.定义起始位置start(0角标),定义末位置end(lenght-1位置,即最后一位)
  4. 2.无限循环的查找一个值,先看看该值是不是在中间mid角标,mid=(star+end)/2
  5. 3.如果该值大于mid角标对应值,那么start变成mid的右边一位,如果小于,那么end就变成mid的左边一位,这样会极其的高效.
  6. 5.找到值就返回值或打印,找不着也返回-1或打印,并停止循环.
      6.在排序中关键字比较次数同记录初始排列无关的

 


2.图文描述过程


现有需求:

  1. 1.有一个已经排列好顺序的从小到大的数组.
  2. 2.请查询一个数字所在的角标位置.
  3. 3.如果元素不存在,请给出如果插入,那么应该插入的位置.

3.代码详情(参考 https://www.cnblogs.com/snowcan/p/6244361.html)

  1.  
  1. public class BinaryInsertSort {
  2.  
  3. public static void main(String[] args) {
    // TODO Auto-generated method stub
    int[] arr = {3,1,5,7,2,4,9,6};
    new BinaryInsertSort().binaryInsertSort(arr);
    }
  4.  
  5. /**
    * 折半插入排序算法的实现
    */
    public void binaryInsertSort(int[] arr){
    int n=arr.length;
    int i,j;
    for (i=1;i<n;i++){
    int temp=arr[i];
    int low=0;
    int high=i-1;
    while (low<=high){
    int mid=low+(high-low)/2;
    if(temp>arr[mid]){
    low=mid+1;
    }else if(temp<arr[mid]){
    high=mid-1;
    }
    }
    for (j=i-1;j>=low;j--){
    arr[j+1]=arr[j];
    }
    arr[low]=temp;
    /**
    * 打印每次循环的结果
    */
    printProcess(arr,n,i);
    }
    /**
    * 打印排序结果
    */
    printResult(arr,n);
    }
  6.  
  7. /**
    * 打印排序的最终结果
    * @param arr
    * @param n
    */
    private void printResult(int[] arr, int n) {
    System.out.print("最终排序结果:");
    for(int j=0;j<n;j++){
    System.out.print(" "+arr[j]);
    }
    System.out.println();
    }
  8.  
  9. /**
    * 打印排序的每次循环的结果
    * @param arr
    * @param n
    * @param i
    */
    private void printProcess(int[] arr, int n, int i) {
    System.out.print("第"+i+"次:");
    for(int j=0;j<n;j++){
    System.out.print(" "+arr[j]);
    }
    System.out.println();
    }
    }
  1.  
  1. 运行结果:
    1次: 1 3 5 7 2 4 9 6
    2次: 1 3 5 7 2 4 9 6
    3次: 1 3 5 7 2 4 9 6
    4次: 1 2 3 5 7 4 9 6
    5次: 1 2 3 4 5 7 9 6
    6次: 1 2 3 4 5 7 9 6
    7次: 1 2 3 4 5 6 7 9
    最终排序结果: 1 2 3 4 5 6 7 9

4.总结:

二分法查找,又称折半查找,大家需要记住的重点有

  1. 1.优点是比较次数少,查找速度快,平均性能好;
    其缺点是要求待查表为有序表,且插入删除困难。
    因此,折半查找方法适用于不经常变动而查找频繁的有序列表。它的算法要求是必须是顺序存储结构,必须有序排列2.确定最左边的start,最右边的end
  2. 3.无限循环当中找mid角标对应的值,startend会根据情况改变
  3. 4.当发现startend交叉,那么证明找不到,即如果放入该元素,那么就应该放在此时的start位置.
    5.使用二分查找算法在一个有序序列中查找一个元素的时间复杂度为(logn )。
    原因:折半查找,每次都是1/2,设寻找t次,等式为2t =n,n为数据的总数,倒过来就答案B
    总共有n个元素,渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数,由于你n/2^k取整后>=1,即令n/2^k=1
    6.设有序顺序表中有n个数据元素,则利用二分查找法查找数据元素X的最多比较次数不超过 log2n+1
    因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:
    一次二分剩下:n/2
    两次二分剩下:n/2/2 = n/4
    ......
    m次二分剩下:n/(2^m)
    在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为
     n/(2^m)=1;
  2^m=n;

  此时时间复杂度为log2(n)

  再与最后一个元素比较复杂度+1

  所以时间复杂度为:log2(n)+1
  1.  

"二分法"-"折半法"-查找算法-之通俗易懂,图文+代码详解-java编程的更多相关文章

  1. 折半插入排序 之通俗易懂,图文+代码详解-java编程

    转自http://blog.csdn.net/nzfxx/article/details/51615439 1.特点及概念介绍 下面给大家讲解一下"二分法查找"这个java基础查找 ...

  2. 《机器学习实战》kNN算法及约会网站代码详解

    使用kNN算法进行分类的原理是:从训练集中选出离待分类点最近的kkk个点,在这kkk个点中所占比重最大的分类即为该点所在的分类.通常kkk不超过202020 kNN算法步骤: 计算数据集中的点与待分类 ...

  3. 关于折半法查找的一些总结以及ArrayList类的总结

    一.折半法查找的总结(这算法很好理解,但我花了好久琢磨他有啥用.....) 1.实际意义 折半法查找主要是为了能够很快在一个数组中找出我们所需要的那个元素,与往常我们通过一个一个比较的方法不同,折半法 ...

  4. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  5. Django--filter()-字段查找(双下划线的使用详解)

    Django--filter()-字段查找(双下划线的使用详解) 在了解django中的字段查找的同时,让我们先熟悉一下比较符: 大于--gt-(greater than) 小于--lt-(less ...

  6. Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法

    Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法: https://blog.csdn.net/mingjie1212/article/details/485250 ...

  7. SSD算法及Caffe代码详解(最详细版本)

    SSD(single shot multibox detector)算法及Caffe代码详解 https://blog.csdn.net/u014380165/article/details/7282 ...

  8. IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解,DNS域名设计

    本文参考:<计算机网络: IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解> IP地址 概述 计算机要实现网络通信,就必须要有一个用于快速定位的网络地址.IP地址就是计算机在网络 ...

  9. c++ LeetCode(初级数组篇)十一道算法例题代码详解(一)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10940636.html 唉!最近忙着面试找实习,然后都是面试的很多是leetcode的算法题, ...

随机推荐

  1. rails应用ajax之三:进一步完善ajax动画特效果

    本猫已经对界面放低标准很久了,但是复习了ajax之后突然发现:哇!原来世界可以这么美,这么生动鲜活的!所以本篇主要讨论下如何用ajax在rails中做一些简单的动画效果. 其实最新版的的rails中使 ...

  2. apt-get Ubuntu本地ISO镜像入源

    转自http://blog.csdn.net/binchel/article/details/21486999 在没有网络的情况下,本地镜像源不实为一个上等的权宜之计! 目前linux的两大主流包管理 ...

  3. ftp实现普通账号和vip账号限速

    ftp工作流程: ftp回话包含了两个通道,控制通道和数据通道,ftp的工作有两种模式,一种是主动模式,一种是被动模式,以ftpserver为参照物,主动模式,服务器主动连接客户端传输,被动模式,等待 ...

  4. 项目中Orcale存储过程优化记录

    今天对之前写的Orcale存储过程做了一些优化,使其变得更加灵活,之前写的存储过程是使用游标存储SQL执行结果,但是使用游标带来的弊端是,在声明时,它所执行的SQL就已经被写死,无法修改.若想更加灵活 ...

  5. eclipse中tomcat内存溢出设置

    Eclipse里启动Tomcat,配置内存大小 2009年12月11日 星期五 10:50 一般安装完eclipse之后,在安装目录下你应该可以看到有一个 eclipse.ini 文件,对了,就是在这 ...

  6. Android框架之Volley与Glide

    PS:在看到这个题目的同时,你们估计会想,Volley与Glide怎么拿来一块说呢,他们虽然不是一个框架,但有着相同功能,那就是图片处理方面.首先我们先来看一下什么volley,又什么是glide. ...

  7. eclipse乱码

    eclipse乱码:Windows >general >Workspace UTF-8Windows >general >Editors >Text Editors &g ...

  8. C#中的var和dynamic

    在理解var和dynamic关键字之前,让我们先了解一下编程语言的类别. C#中有两类编程语言: 静态类型语言类别 动态语言类别 静态类型语言 静态类型语言也被称为强类型语言.所谓强类型语言,通俗的讲 ...

  9. InnoDB的4个特性

    innodb 的四个特性 insert buffer innodb使用insert buffer"欺骗"数据库:对于为非唯一索引,辅助索引的修改操作并非实时更新索引的叶子页,而是把 ...

  10. python---购物车

    购物车功能如下: 1. 输入收入多少,购买商品 2. 打印购物清单,根据清单选择商品: 3. 结算,打印购物清单及总金额 # -*- coding:utf-8 -*- # LC goods=[[1,' ...