作者QQ:1095737364    QQ群:123300273     欢迎加入!

1.基本思想

  二分法插入排序的思想和直接插入一样,只是找合适的插入位置的方式不同,这里是按二分法找到合适的位置,可以减少比较的次数。

2.实现原理

  通过折半查找的方式找到合适的插入位置再插入(直接插入排序的升级版)。

3.代码实例

  (1)代码:

public static void biInsertSort(int arr[]){
for(int i = 1; i < arr.length; i ++){
int temp = arr[i];
int left = 0;
int right = i-1;
while(left <= right){//通过拆装查找找到插入位置
int mid = (left+right)/2;
if(temp < arr[mid]){//插入点在[left,mid-1]
right = mid-1;
}else //插入点在[mid+1,right]
left = mid+1;
}//直到找到合适的位置(left或right+1),接下来就将left/right+1后的元素后移
for(int j = i-1;j >= right+1; j --){
arr[j+1] = arr[j];
}
arr[right+1] = temp;
}
}
public static void main(String[] args) {
int array[] = {2,5,3,1,5,2,8};
System.out.println("排序之前:");
for(int element : array){
System.out.print(element+" ");
}
biInsertSort(array);
System.out.println("\n排序之后:");
for(int element : array){
System.out.print(element+" ");
}
}

  (2)结果:

排序之前:
2 5 3 1 5 2 8
排序之后:
1 2 2 3 5 5 8

4.算法分析

  不管元素的初始序列为正序还是反序,其时间复杂度都和直接插入排序的一样为O(n2)。不同的是折半插入排序中查找的平均比较次数为log2(i+1)-1,所以就平均性能而言,折半插入排序优于直接插入排序。同样,折半插排序的空间复杂度也是O(1),且也是一种稳定的排序。

5.排序特点

  (1)二分搜索比顺序搜索查找快,所以二分插入排序就平均性能来说比直接插入排序要快。
  (2)它所需的排序码比较次数与待排序对象序列的初始排列无关,仅依赖于对象个数。在插入第i个对象时,需要经过log2i+1次排序码比较,才能确定它应插入的位置。 将n个对象用折半插入排序所进行的排序码比较次数比较次数(KCN):∑n−1(log2i+1)≈nlog2n
  (3)二分插入排序是一个稳定的排序方法。
  (4)当n较大时,总排序码比较次数比直接插入排序的最坏情况要好得多,但比其最好情况要差。
  (5)在对象的初始排列已经按排序码排好序或接近有序时,直接插入排序比折半插入排序执行的排序码比较次数要少。折半插入排序的对象移动次数与直接插入排序相同,依赖于对象的初始排列。
 

排序算法(2)--Insert Sorting--插入排序[2]--binary insertion sort--折半(二分)插入排序的更多相关文章

  1. 折半插入排序(Binary Insertion Sort)的C语言实现

    原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia   折半插入排序(Binary Insertion Sort)的基本思想是将新记录插入到已经 ...

  2. JavaScript 排序算法(JavaScript sorting algorithms)

    JavaScrip 排序算法(JavaScript Sorting Algorithms) 基础构造函数 以下几种排序算法做为方法放在构造函数里. function ArrayList () { va ...

  3. 排序之直接插入排序(Straight Insertion Sort)

    一.直接插入排序(Straight Insertion Sort) 排序的过程如下:给定无需序列:(3,6,9,7,1,8,2,4) ① 3,6,9,7,1,8,2,4 (将6插入到有序序列3中) ② ...

  4. ​直接插入排序(Straight Insertion Sort)

    1.定义 直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. 插入排序(Insertion Sort ...

  5. 直接插入排序(Straight Insertion Sort)

    直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. /* 对顺序表L作直接插入排序 */ void ...

  6. 2-路插入排序(2-way Insertion Sort)的C语言实现

    原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia   2-路插入排序(2-way Insertion Sort)的基本思想:     比fis ...

  7. 直接插入排序(Straight Insertion Sort)的C语言实现

    原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia   直接插入排序(Straight Insertion Sort)的基本思想是将新记录插入到 ...

  8. 普林斯顿大学算法课 Algorithm Part I Week 3 排序算法复杂度 Sorting Complexity

    计算复杂度(Computational complexity):用于研究解决特定问题X的算法效率的框架 计算模型(Model of computation):可允许的操作(Allowable oper ...

  9. 排序算法(3)--Insert Sorting--插入排序[3]--Shell Sort--希尔排序

    1.基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 2.实现原理 对于n ...

随机推荐

  1. Dubbo原理实现之使用Javassist字节码结束构建代理对象

    JavassistProxyFactory利用自己吗技术构建代理对象的实现如下: public <T> T getProxy(Invoker<T> invoker, Class ...

  2. BIND DNS拒绝服务漏洞 CVE-2016-2776修复

    接到此漏洞之后,略微查了一下相关描述,发现漏洞影响范围很大,可能造成的影响也很严重,于是着手进行修复. 漏洞的详细信息可见如下链接: http://www.cnvd.org.cn/flaw/show/ ...

  3. [Umbraco] DocumentType设计指南

    1. 命名规则 1.1. 文档类型(DocumentType)命名规则 图 1. Document Type命名示例 名称(Name)   采用帕斯卡命名法 如:TextPage 别名(Alias)  ...

  4. vmworkstation安装unbuntu server 网络配置:NAT模式

    之前安装虚拟机测试环境的时候,习惯了使用桥接模式或者仅主机模式:今天偶然发现,其实NAT 模式的网络配置还是挺方便的. 在新建虚拟机的时候,选择网络模式为NAT,虚拟机创建完成之后,在vmworkst ...

  5. MVC3学习:利用jquery+ajax生成二维码(支持中文)

    二维码越来越热火了,做电子商务网站,不做二维码,你就OUT了. 一.下载DLL文件(ThoughtWorks.QRCode.dll),并在项目中引用.点此下载 如果你还不知道什么是QRCode二维码, ...

  6. 在 ASP.NET MVC 中使用异步控制器

    线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个 ...

  7. chrome版本与对应的chromedriver驱动【转载】

    chrome版本与对应的谷歌驱动(chromedriver) 1.下载chromedriver:http://chromedriver.storage.googleapis.com/index.htm ...

  8. JAVA里的VO、BO、PO分别指什么?

    VO(value object) 值对象 通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已.但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.个人觉得同DTO(数据传输对象 ...

  9. Netbeans 8.0配置Python开发环境

    1. 菜单栏:工具->插件->设置->添加 配置如下信息: http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/last ...

  10. c# winform 获取当前程序运行根目录

    1 // 获取程序的基目录. 2 System.AppDomain.CurrentDomain.BaseDirectory 3 4 5 // 获取模块的完整路径. 6 System.Diagnosti ...