转自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. [51nod 1515] 明辨是非

    Description 给\(n\)组操作,每组操作形式为\(x\;y\;p\). 当\(p\)为\(1\)时,如果第\(x\)变量和第\(y\)个变量可以相等,则输出\(YES\),并限制他们相等: ...

  2. 几个SQL命令的使用

    几个SQL命令的使用 [原创 2006-4-21 14:22:05]     字号:大 中 小 1.Update批量更改 例如:A.B两个表,A,B有相同字段id,现将B中的b_passerd覆盖掉A ...

  3. 在vs2013下手把手创建/调用dll

    body { font: 16px } 参考了大佬的文章 首先,体会一下静态编译: 创建Win32Project,选DLL,添加一个.h和.cpp文件 点击生成解决方案,然后去debug目录下拷贝.l ...

  4. Spring Cache 笔记

    @(Java ThirdParty)[Spring Cache] Spring Cache Abstraction 简介 Spring Cache提供了对底层缓存使用的抽象,通过注解的方式使用缓存,减 ...

  5. sql server 多行数据合并成一列

    首先是源数据: ),cip.CheckIn_StartTime, )),cip.CheckIn_EndTime, )),cip.Rental_Price)) as content from Check ...

  6. windows下注册表的操作

    原博:https://blog.csdn.net/denghubu/article/details/5765921 1.       注册表简介 注册表是为Windows NT和Windows95中所 ...

  7. 强大的代码编辑器 phpstorm version 2016.2 License Server激活

    "磨刀不误砍柴工","工欲善其事必先利其器",找个一个好的代码开发编辑工具可以让我们事半功倍,并且代码质量得到保障,在这里就推荐一款强大的代码编辑器,不对其实可 ...

  8. 浏览器渲染原理笔记 --《How Browser Work》读后总结

    综述 之前使用ExtJS时遇到一个问题:为什么依次设置多个组件的可见性界面会卡顿?在了解HTML的dom操作相关内容的时候也好奇这个东西到底是怎么回事,然后尤其搞不懂CSS和Html分管样式和网页结构 ...

  9. LeeCode数组第15题三数之和

    题目:三数之和 内容: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中 ...

  10. 基于分支限界法的旅行商问题(TSP)一

    旅行推销员问题(英语:Travelling salesman problem, TSP)是这样一个问题:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路.它是组合优化 ...