折半插入排序 之通俗易懂,图文+代码详解-java编程
转自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;
此时时间复杂度为log2(n)
折半插入排序 之通俗易懂,图文+代码详解-java编程的更多相关文章
- "二分法"-"折半法"-查找算法-之通俗易懂,图文+代码详解-java编程
转自http://blog.csdn.net/nzfxx/article/details/51615439 1.特点及概念介绍 下面给大家讲解一下"二分法查找"这个java基础查找 ...
- Java 中的泛型详解-Java编程思想
Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的 ...
- 基础 | batchnorm原理及代码详解
https://blog.csdn.net/qq_25737169/article/details/79048516 https://www.cnblogs.com/bonelee/p/8528722 ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- ASP.NET MVC 5 学习教程:生成的代码详解
原文 ASP.NET MVC 5 学习教程:生成的代码详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...
- Github-karpathy/char-rnn代码详解
Github-karpathy/char-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2016-1-10 ...
- 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”
来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...
- JAVA类与类之间的全部关系简述+代码详解
本文转自: https://blog.csdn.net/wq6ylg08/article/details/81092056类和类之间关系包括了 is a,has a, use a三种关系(1)is a ...
- Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法
Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法: https://blog.csdn.net/mingjie1212/article/details/485250 ...
随机推荐
- 伙伴算法与slab算法
伙伴算法: 1.将空闲页面分为m个组,第1组存储2^0个单位的内存块,,第2组存储2^1个单位的内存块,第3组存储2^2个单位的内存块,第4组存储2^3个单位的内存块,以此类推.直到m组. 2.每个组 ...
- CodeForces 321A Ciel and Robot(数学模拟)
题目链接:http://codeforces.com/problemset/problem/321/A 题意:在一个二维平面中,開始时在(0,0)点,目标点是(a.b),问能不能通过反复操作题目中的指 ...
- Android四大组件的生命周期
介绍生命周期之前,先提一下任务的概念 任务其实就是activity 的栈它由一个或多个Activity组成的共同完成一个完整的用户体验, 换句话说任务就是” 应用程序” (可以是一个也可以是多个,比如 ...
- groovy入门 第05章 基本输入输出
基本输入输出 5.1基本输出 print XXX //同一行输出 println XXX //换行输出 输出字符串: def message ="My name is Michael& ...
- 【转载】图说OOP基础(一)
本文用图形化的形式描述OOP的相关知识.对OOP进行系统化的梳理,以便掌握. 涉及知识点: OOP的相关知识 OOP知识[Object-Orientation Programming 面向对象编程]总 ...
- Cocos2d-x 精灵碰撞检測(方法一)
声明函数碰撞检測函数,两个精灵和重写update bool isCollision( CCPoint p1,CCPoint p2,int w1,int h1,int w2,int h2 ); CCSp ...
- 用JAVA编写浏览器内核之实现javascript的document对象与内置方法
原创文章.转载请注明. 阅读本文之前,您须要对浏览器怎样载入javascript有一定了解. 当然,对java与javascript本身也须要了解. 本文首先介绍浏览器载入并执行javascript的 ...
- Umbrella Header for Module Bolts does not include header 'XXXXXX.h'?
在我们引入第三方Framwork时.有时会出现如标题的警告提示? 怎样解决? Framework 将在下面文件夹下创建一个Module/,并创建一个module.modulemap文件 waterma ...
- Python 中的字节与字节数组
Python 中的字节与字节数组 - Python - 伯乐在线 http://python.jobbole.com/84839/
- JSP JDBC 读取SQL Server 数据2
<%-- Created by IntelliJ IDEA. User: hellohongfu Date: 2017/12/21 Time: 0:16 To change this templ ...