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

1.特点及概念介绍

    下面给大家讲解一下"二分法查找"这个java基础查找算法,那么什么是二分法呢?其实所谓的"二分法",就是一分为二的意思,综合起来理解就是一分为二的查找,但大家记住了,二分法是建立在"已经按顺序排好"的基础条件上,如果大家把这个二分法查找理解清楚了,那么会有助于你更好的理解快速排序,下面我就罗列出该算法的特点:

    1.定义起始位置start(0角标),定义末位置end(lenght-1位置,即最后一位)
2.无限循环的查找一个值,先看看该值是不是在中间mid角标,mid=(star+end)/2
3.如果该值大于mid角标对应值,那么start变成mid的右边一位,如果小于,那么end就变成mid的左边一位,这样会极其的高效.
5.找到值就返回值或打印,找不着也返回-1或打印,并停止循环.
  6.在排序中关键字比较次数同记录初始排列无关的

 


2.图文描述过程


现有需求:

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

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


public class BinaryInsertSort {

    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);
} /**
* 折半插入排序算法的实现
*/
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);
} /**
* 打印排序的最终结果
* @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();
} /**
* 打印排序的每次循环的结果
* @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 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.优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。它的算法要求是必须是顺序存储结构,必须有序排列2.确定最左边的start,最右边的end
3.无限循环当中找mid角标对应的值,start和end会根据情况改变
4.当发现start和end交叉,那么证明找不到,即如果放入该元素,那么就应该放在此时的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
 

"二分法"-"折半法"-查找算法-之通俗易懂,图文+代码详解-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. ubuntu12.04:Mysql数据库:手动安装

    首先到mysql的下载中心上下载最新的tar.gz包: 1.在浏览器中输入http://www.mysql.com/downloads/ 进入mysql的下载中心,在这里有使用mysql开发的一些工具 ...

  2. html的meta标签

    meta是一个空元素,没有结束标签:meta元素可以附带8个属性,其中4个是通用属性-–dir,lang,xml:lang和title,其他4个是meta特有的属性: schema,name,cont ...

  3. 如何安装Pycharm官方统计代码行插件

    最近一直想统计Pycharm的总计代码行数,找到了官方的统计行数插件,发现效果还不错. 官方代码统计插件指导: https://plugins.jetbrains.com/plugin/4509-st ...

  4. wamp 服务监控和启动

    近日我的 wamp 莫名其妙的崩溃重启,apache 能自动起来, mysql 却悲剧了. 于是有了下面的wamp服务监控和启动的批处理文件 @echo off rem define loop tim ...

  5. 【转】火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法

    关于 GCJ-02 和 BD-09 ,请参考 http://developer.baidu.com/map/question.htm#qa0043 . 算法代码如下,其中 bd_encrypt 将 G ...

  6. Python 爬取美团酒店信息

    事由:近期和朋友聊天,聊到黄山酒店事情,需要了解一下黄山的酒店情况,然后就想着用python 爬一些数据出来,做个参考 主要思路:通过查找,基本思路清晰,目标明确,仅仅爬取美团莫一地区的酒店信息,不过 ...

  7. AttributeError: module 'enum' has no attribute 'IntFlag'

    Mac PyCharm新建以Python3.6.1为解释器的Django项目的时候出现以下错误提示: AttributeError: module 'enum' has no attribute 'I ...

  8. Django中的原子事务相关注意事项

    Django中的原子事务支持(transaction.atomic)方式函数装饰器或者with语句,这种方式特别是前者和spring里面的AOP事务支持方式基本等同,当然其实质方式都是原始的try.. ...

  9. Fiddler抓包使用教程-Android应用抓包

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/74439165 本文出自[赵彦军的博客] Fiddler 也可以支持对手机应用进行 ...

  10. Maven管理多模块应用

    穿越至目录: 从0开始,构建前后端分离应用 对于概念的一些理解 Maven的作用 管理模块之间的依赖:根据业务需求,系统会划分很多模块,这些模块彼此之间存在着依赖关系.比如系统管理模块依赖着文件上传模 ...