插入排序(InsertionSort)
2024-10-19 14:37:13
算法描述
插入排序是在一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序。插入排序是一种稳定的排序。
基本思想
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。
实现步骤
- 从第一个元素开始,这个元素可以认为已经被排序;
- 取出下一个元素a[i],按照从后往前的速度开始扫描;
- 如果当前的元素值比a[i]小,则将该元素下移一位;
- 如果当前的元素值比a[i]大,则将a[i]放到此元素的下一个位置;
- 重复步骤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)
最新文章
- TinyFox/Jexus如何正确使用配置文件
- MAC系统设置SSX教程与下载
- SOA架构设计经验分享—架构、职责、数据一致性
- 使用ansible编译安装运维工具tmux
- OAF_开发系列09_实现OAF预提取LOV设定(案例)
- ruby md5加签验签方法
- Android--Notification
- YTU 2019: 鞍点计算
- Combination Sum [LeetCode]
- FreeMarker笔记 第二章 数值和类型
- SVN遇到的几个错误问题解决办法
- VJP1456 最小总代价(状压)
- HTML——左右側边栏布局
- electron 使用 node-ffi C++ 动态链接库(DLL)
- Java 操作jar包工具类以及如何快速修改Jar包里的文件内容
- vscode restclient 插件
- 数据库交互之减少IO次数
- photoshop cc 2017安装
- 编写高质量代码:改善Java程序的151个建议 --[52~64]
- oracle存储过程---创建存储过程语句
热门文章
- Apache Flume - File通道设计
- [LeetCode] 21. Merge Two Sorted Lists ☆
- mvc Dapper_Report_Down_ExcelFile
- 【Codeforces】868C. Qualification Rounds
- Vue前端开发规范(山东数漫江湖)
- Spring Data JPA 的使用(山东数漫江湖)
- 大聊Python----通过Socket实现简单的ssh客户端
- winform Textbox像百度一下实现下拉显示
- 伪病毒 Rp_test
- Grunt构建工具