算法描述:

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

Java代码:

package ljp.sort.insert; public class InsertSortDemo01 { private int[] list; public InsertSortDemo01(int[] list){ this.list = list; } public void sort(){ int count = 0;//排序次数 for(int i = 1;i<list.length;i++){ for(int j = 0;j<i;j++){ if(list[i]<list[j]){ int temp = list[i]; for(int k = i;k>j;k--){ list[k] = list[k-1]; } list[j] = temp; } } System.out.println("第"+ ++count +"次排序:"); 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); } InsertSortDemo01 sort = new InsertSortDemo01(list); System.out.println("排序前:"); sort.display(); sort.sort(); } }

运行结果:

排序前:
300 748 262 274 284 263 135 283 388 477
第1次排序:
300 748 262 274 284 263 135 283 388 477
第2次排序:
262 300 748 274 284 263 135 283 388 477
第3次排序:
262 274 300 748 284 263 135 283 388 477
第4次排序:
262 274 284 300 748 263 135 283 388 477
第5次排序:
262 263 274 284 300 748 135 283 388 477
第6次排序:
135 262 263 274 284 300 748 283 388 477
第7次排序:
135 262 263 274 283 284 300 748 388 477
第8次排序:
135 262 263 274 283 284 300 388 748 477
第9次排序:
135 262 263 274 283 284 300 388 477 748

算法分析:

在最坏的情况下,内层循环的次数为i才可以找到合适的插入位置,每一次排序,对于一个元素为n的集合,都需要循环n-1次,所以

T(n) = 1 + 2 + ······ + n-1 = O(n^2)

最好的情况下,内层循环的次数为0次就可以找到合适的插入位置,所以总循环次数(不算插入操作时以为的循环)为

T(n) = 1 + 1 + ······ + 1 = n-1 = O(n)

在平均情况下,插入位置随机出现,假设出现的概率相等,这样子内层循环的次数平均为i/2。所以排序总循环次数(不算插入操作时以为的循环)为

T(n) = 1/2 + 2/2 + ······ + (n-1)/2 = (n-1)n/4 = O(n^2)

所以该算法的时间复杂度为O(n^2)。

原地排序:原地排序是指排序过程中不使用临时空间,即排序前和排序后元素都在同一地方的排序。

根据原地排序的定义,插入排序也是一种原地排序。

排序算法稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

从排序算法稳定性的概念来看,插入排序算法是稳定的

转载于:https://www.cnblogs.com/JPAORM/archive/2012/04/10/2510090.html

排序算法第一篇——插入排序相关推荐

  1. php代码编写直接插入排序算法,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析...

    本文实例讲述了PHP排序算法之直接插入排序(Straight Insertion Sort).分享给大家供大家参考,具体如下: 算法引入: 在这里我们依然使用<大话数据结构>里面的一个例子 ...

  2. 插入排序 php,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析

    本文实例讲述了PHP排序算法之直接插入排序(Straight Insertion Sort).分享给大家供大家参考,具体如下: 算法引入: 在这里我们依然使用<大话数据结构>里面的一个例子 ...

  3. 插入排序java_排序算法之直接插入排序Java实现

    排序算法之直接插入排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序:ht ...

  4. 排序算法(2)直接插入排序

    排序算法(2)直接插入排序 原理:将数组中的所有元素依次和前面的已经排好序的元素相比较(依次)  ,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过. 代码实现: void InsertS ...

  5. 排序算法第二篇——折半插入排序

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

  6. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

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

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

  8. C/C++排序算法(1)直接插入排序

    常见排序算法总结(1)直接插入排序 一篇文章,带你搞懂 插入排序 (注:代码语言的选择不应该限制了我们对算法的理解) (1)算法原理 插入排序是一种最简单直观的排序算法,思想就是,从第二个数开始(下标 ...

  9. 排序算法之简单插入排序法

    对于初学者来说,排序算法是C语言学习的一个重点和难点,我就来分享一下我的学习心得吧! 排序算法有3类:1.交换类排序法.包括冒泡排序和快速排序 2.插入类排序法.包括简单插入排序和希尔排序 3.选择类 ...

最新文章

  1. Linux存储的基本管理
  2. 如何用R语言在机器学习中建立集成模型?
  3. PowerShell runspace 的创建,使用和查错
  4. iOS - 数据持久化之 FMDB 的使用
  5. vconsole插件_移动端调试面板插件vconsole
  6. linux 计算标准差,Azure Linux VM 的计算基准测试分数 - Azure Virtual Machines | Microsoft Docs...
  7. CSV 导入SQL Server(bulk insert方式)
  8. 大数据十大核心原理(互联网上整理)
  9. 纳韦斯托克斯方程的推导_什么是纳维-斯托克斯方程?
  10. SQL 语句,聚沙成塔
  11. python读取163邮件内容_python 3.x 163邮箱登陆,邮件读取
  12. Nginx配置https(ssl证书)并反向代理Springboot Jar项目
  13. C语言 写一个函数求两个数的较大值
  14. 3. 搞定收工,PropertyEditor就到这
  15. Time Series FeatuRe Extraction on basis of Scalable Hypothesis tests (tsfresh –A Python package)
  16. Excel.cpp和Excel.h的获取
  17. Axon Framework简介
  18. 20级网络学生---循环
  19. 一边攒大米,一边做公益
  20. 芯片验证自学,IC验证自学入门教程:ASIC芯片设计流程讲解

热门文章

  1. 05章项目: QuickHit快速击键
  2. CentOS6.5安装telnet命令
  3. Java Map遍历方式的选择
  4. 微信页面设计 小总结
  5. Safe Or Unsafe(hdu2527)哈弗曼VS优先队列
  6. 【MyBatis笔记】13-一对多左连接查询分步查询(查询所有客户及客户对应的订单)
  7. GET XXX net::ERR_CONNECTION_REFUSED
  8. AI+BI,真的如想象中的那么美好吗?
  9. 学会用这个工具做分析,1年积累3年工作经验
  10. Matplotlib库Api整理