算法描述:

在上一篇插入排序算法中,已经提到,插入排序的核心是在有序的集合中找到要插入的位置。所以,在这里介绍一种对插入排序的改进算法,即折半插入排序。折半插入排序是指利用折半查找的算法,在有序集合中找到要插入的位置。

Java代码:

package ljp.sort.insert; public class InsertSortDemo02 { private int[] list; public InsertSortDemo02(int[] list) { this.list = list; } // 将i位置的元素插入到j位置 public void insert(int i, int j) { if (i != j) { int temp = list[i]; for (int k = i; k > j; k--) { list[k] = list[k - 1]; } list[j] = temp; } } public void sort() { for (int i = 1; i < list.length; i++) { int start = 0; int end = i - 1; if (list[i] < list[i - 1]) { int j = i; while (end >= start) { j = (start + end) / 2; if (list[i] > list[j]) { start = j + 1; if (start < list.length && list[i] < list[start]) { j=start; break; } } else if (list[i] < list[j]) { end = j - 1; if (end > 0 && list[i] > list[j - 1]) { break; } } else { break; } } insert(i, j); } System.out.println("第" + i + "次排序:"); display(); } } public void display() { for (int i : list) { System.out.print(i + " "); } System.out.println(); } public static void main(String[] args) { int[] list = new int[10]; for (int i = 0; i < list.length; i++) { list[i] = (int) (Math.random() * 1000); } InsertSortDemo02 sort = new InsertSortDemo02(list); System.out.println("排序前:"); sort.display(); sort.sort(); } }

运行结果:

排序前:
719 660 723 463 586 925 971 922 544 890
第1次排序:
660 719 723 463 586 925 971 922 544 890
第2次排序:
660 719 723 463 586 925 971 922 544 890
第3次排序:
463 660 719 723 586 925 971 922 544 890
第4次排序:
463 586 660 719 723 925 971 922 544 890
第5次排序:
463 586 660 719 723 925 971 922 544 890
第6次排序:
463 586 660 719 723 925 971 922 544 890
第7次排序:
463 586 660 719 723 922 925 971 544 890
第8次排序:
463 544 586 660 719 723 922 925 971 890
第9次排序:
463 544 586 660 719 723 890 922 925 971
时间复杂度分析:由于二分查找的时间复杂度为O(log2n),所以折半插入排序算法的复杂度为O(nlog2n)。

稳定性分析:有排序算法稳定性概念可知,折半插入排序算法是稳定的。

转载于:https://www.cnblogs.com/JPAORM/archive/2012/04/11/2510089.html

排序算法第二篇——折半插入排序相关推荐

  1. [ 数据结构 -- 手撕排序算法第二篇 ] 冒泡排序

    手撕排序算法系列之:冒泡排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...

  2. 【数据结构----笔记4】插入排序算法之【折半插入排序算法】

    /*__________________________________________________________________________________________________ ...

  3. 【排序算法】图解直接插入排序(图解堪比Debug显示每次循环结果)

    [排序算法]图解直接插入排序(图解堪比Debug分析每次循环结果) 写在前面: 本文主要介绍直接插入排序算法,通过图片一步步解释每一趟每一次的后移.代码通过C#实现,并输出每一次交换的情况和比较次数, ...

  4. 排序算法:冒泡排序、插入排序、选择排序、希尔排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...

  5. 排序算法lowb三人组-插入排序

    排序算法lowb三人组-插入排序 def insert_sort(li):for i in range(1, len(li)): # i表示摸到的牌的下标tmp = li[i] # 摸到的牌j = i ...

  6. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  7. 排序算法第一篇——插入排序

    算法描述: 从一个无序的集合中取出一个元素,插入到一个有序的集合的合适位置,有序的集合插入新元素之后,仍然是有序的.所以该算法最核心的部分是要在有序集合中找到合适的插入位置. Java代码: pack ...

  8. 10种排序算法比较(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序)

    本文(所有排序算法代码+综合比较代码)链接:https://download.csdn.net/download/qq_39932172/11217572 一.比较目的: 由于<数据结构> ...

  9. 各种排序算法总结篇(高速/堆/希尔/归并)

    1.高速排序 交换排序有:冒泡(选择)排序和高速排序,冒泡和选择排序的时间复杂度太高,思想非常easy临时不讨论.高速排序基于一种分治的思想,逐步地使得序列有序. #include <iostr ...

最新文章

  1. onpaste事件不生效_从实际开发中来看JavaScript事件循环的使用场景
  2. 用 vue + d3 画一棵树
  3. BZOJ2494 Triangles and Quadrangle
  4. dede mysql x_认识Dede的mysql数据库结构功能
  5. centos 一键安装ftp 配置_CentOS快速搭建FTP(初级-四步)
  6. obj.toSource()
  7. c++ 反射_Java代码审计基础之反射
  8. php 睡眠,php输出与sleep()
  9. 虚拟化时代 智能数据管理架构才是王道
  10. 如何在引导程序中将容器垂直对齐
  11. Eclipse创建并运行Java程序输出Hello World
  12. Entity Framework 实现in查询
  13. 考试倒计时,计算机二级重难点汇总【39套历年考题】
  14. AndroidStudio配置一键360加固gradle脚本
  15. mysql 美元符号_坑爹的PostgreSQL的美元符号(有时需要替换成单引号)
  16. NoteExpress 自定义参考文献输出样式
  17. worldPress数据库
  18. 带网络接口的打印机和USB接口打印机的共享区别
  19. 【机器学习代码模板】把你的线性回归模型拉出来遛一遛
  20. opencv 级联分类器

热门文章

  1. 稳态可压Navier-Stokes方程组在修正Dirichlet边界下的解的存在性
  2. SELinux系列(九)——SELinux auditd日志系统的安装与启动
  3. [转]简明 Nginx Location Url 配置笔记
  4. anaconda 清华源挂了 怎么办 上交源ok
  5. 时间管理专题_理论篇
  6. lan口配置 petalinux_PetaLinux开发文档
  7. 分享《数字化建设地图》与《BI地图》,大数据知识点一次看过瘾
  8. Red5 9的安装配置以及AS3连接red5简单示例 .
  9. 会mysql不会sql_不是吧,不会有人还不知道MySQL中具实用的SQL语句
  10. java中减法命令_java中减法和乘法的性能比较