博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
折半插入排序 之通俗易懂,图文+代码详解-java编程
阅读量:7227 次
发布时间:2019-06-29

本文共 2067 字,大约阅读时间需要 6 分钟。

转自

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
arr[mid]){ low=mid+1; }else if(temp
=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
 
运行结果: 第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,最右边的end3.无限循环当中找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
 

转载于:https://www.cnblogs.com/lijingran/p/8608323.html

你可能感兴趣的文章
MySQL无法启动几种常见问题小结
查看>>
阿里CTO:阿里所有技术和产品输出都将必须通过阿里云进行
查看>>
更好用的集群限流功能,Sentinel 发布 v1.4.2
查看>>
Python(生成执行文件)
查看>>
redis安装配置 - ttlsa教程系列之redis
查看>>
Linux --DHCP服务器配置;DHCP服务器中继
查看>>
IE版本多的可爱_已迁移
查看>>
eclipse查看jar包中class的中文注释乱码问题的解决
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
mariadb安装
查看>>
vue+vuex+axios+echarts画一个动态更新的中国地图
查看>>
5.8 volumetric post-processing--game programming gems5 笔记
查看>>
8086的地址空间
查看>>
Android开发动画效果被遮掉的解决方法
查看>>
Apache2.2.17源码编译安装以及配置虚拟主机
查看>>
2017年开发语言排名
查看>>
读二进制表的显示 Binary Watch
查看>>
我的友情链接
查看>>
linux基础:10、基础命令(4)
查看>>