转自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. Java 中的泛型详解-Java编程思想

    Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的 ...

  3. 基础 | batchnorm原理及代码详解

    https://blog.csdn.net/qq_25737169/article/details/79048516 https://www.cnblogs.com/bonelee/p/8528722 ...

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

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

  5. ASP.NET MVC 5 学习教程:生成的代码详解

    原文 ASP.NET MVC 5 学习教程:生成的代码详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  6. Github-karpathy/char-rnn代码详解

    Github-karpathy/char-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-1-10 ...

  7. 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”

    来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...

  8. JAVA类与类之间的全部关系简述+代码详解

    本文转自: https://blog.csdn.net/wq6ylg08/article/details/81092056类和类之间关系包括了 is a,has a, use a三种关系(1)is a ...

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

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

随机推荐

  1. 第21章、OnItemSelectedListener事件(从零开始学Android)

    在Android App应用中,OnItemSelectedListener事件也会经常用到,我们一起来了解一下. 基本知识点:OnItemSelectedListener事件 一.界面 1.新建pr ...

  2. 步步为营(十六)搜索(二)BFS 广度优先搜索

    上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起 ...

  3. Solidworks如何创建投影曲线

    画好草图之后(草图是在上视基准面上画的)然后点击曲线,投影曲线   面选择要投影的曲面,然后就得到了平面曲线在曲面上的投影得到的空间曲线   注意这种方法对于开环轮廓也是可以用的,比如下面,我定义一个 ...

  4. NHibernate之旅(7):初探NHibernate中的并发控制

    本节内容 什么是并发控制? 悲观并发控制(Pessimistic Concurrency) 乐观并发控制(Optimistic Concurrency) NHibernate支持乐观并发控制 实例分析 ...

  5. PHP开发的一些趣事

    配置运行环境studyPhp: http://www.phpstudy.net/phpstudy/PhpStudy20180211.zip PHP运行环境:5.4 首先做的是一个表单测试吧 <! ...

  6. linux下查看网卡信息的命令

    rhel 内核版本号信息: [root@hvrhub ~]# uname -a Linux hvrhub 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2 ...

  7. mybatis 简单项目步骤

    mybatis.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configura ...

  8. android 项目R文件丢失解决的方法

    R文件丢失的原因有非常多,这里提供几种解决的方法: 1.  选中项目,点击 Project - Clean , 清理一下项目. 2. 选中项目,右键 选择 Android Tools  - Fix P ...

  9. Ubuntu 16.04 同时使用python3.5

    Python 3.x版本使用pip3,它会把你想下载的包放到usr/local/lib/python3.5/dist-packages/下,而非usr/local/lib/python2.7/dist ...

  10. BoW(SIFT/SURF/...)+SVM/KNN的OpenCV 实现

    本文转载了文章(沈阳的博客),目的在于记录自己重复过程中遇到的问题,和更多的人分享讨论. 程序包:猛戳我 物体分类 物体分类是计算机视觉中一个很有意思的问题,有一些已经归类好的图片作为输入,对一些未知 ...