算法描述

插入排序是在一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序。插入排序是一种稳定的排序。

基本思想

插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。

实现步骤

  1. 从第一个元素开始,这个元素可以认为已经被排序;
  2. 取出下一个元素a[i],按照从后往前的速度开始扫描;
  3. 如果当前的元素值比a[i]小,则将该元素下移一位;
  4. 如果当前的元素值比a[i]大,则将a[i]放到此元素的下一个位置;
  5. 重复步骤2,直到完成所有的元素的排序。

算法实现

//插入排序
void InsertionSort(int a[], int length)
{
//排序序列中的第i个元素,i属于[1,2,...,n]的区间
for(int i = ; i <= length; i++)
{ int temp = a[i];
//a[1],a[2],...,a[i-1]序列是有序的,插入a[i]
for(int j = i- ; j >= -; j--)
{
if( a[j] <= temp)
{
//将第j-1的元素赋值给第j位
a[j+] = a[j];
} //完成排序的条件:1.a[j]>temp;2.j移动到-1的位置
if( a[j] > temp || j < )
{
//排序完毕,将temp赋值给a[j+1]
a[j+] = temp;
break;
}
}
}
}

性能分析

如果数组是有序的,那么需要n-1次的比较,时间复杂度为o(n)

如果数组不是有序的,那么时间复杂度为o(n^2),所以平均时间复杂度为o(n^2)

空间复杂度为o(1)

最新文章

  1. TinyFox/Jexus如何正确使用配置文件
  2. MAC系统设置SSX教程与下载
  3. SOA架构设计经验分享—架构、职责、数据一致性
  4. 使用ansible编译安装运维工具tmux
  5. OAF_开发系列09_实现OAF预提取LOV设定(案例)
  6. ruby md5加签验签方法
  7. Android--Notification
  8. YTU 2019: 鞍点计算
  9. Combination Sum [LeetCode]
  10. FreeMarker笔记 第二章 数值和类型
  11. SVN遇到的几个错误问题解决办法
  12. VJP1456 最小总代价(状压)
  13. HTML——左右側边栏布局
  14. electron 使用 node-ffi C++ 动态链接库(DLL)
  15. Java 操作jar包工具类以及如何快速修改Jar包里的文件内容
  16. vscode restclient 插件
  17. 数据库交互之减少IO次数
  18. photoshop cc 2017安装
  19. 编写高质量代码:改善Java程序的151个建议 --[52~64]
  20. oracle存储过程---创建存储过程语句

热门文章

  1. Apache Flume - File通道设计
  2. [LeetCode] 21. Merge Two Sorted Lists ☆
  3. mvc Dapper_Report_Down_ExcelFile
  4. 【Codeforces】868C. Qualification Rounds
  5. Vue前端开发规范(山东数漫江湖)
  6. Spring Data JPA 的使用(山东数漫江湖)
  7. 大聊Python----通过Socket实现简单的ssh客户端
  8. winform Textbox像百度一下实现下拉显示
  9. 伪病毒 Rp_test
  10. Grunt构建工具