插入排序—直接插入排序(Straight Insertion Sort)

简介: 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插插入到已入,直至整个序列有序为止。 要点:设立哨兵,作为临时存储和判断数组边界之用。

基本思想:

将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插插入到已入,直至整个序列有序为止。

要点:设立哨兵,作为临时存储和判断数组边界之用。

直接插入排序示例:

 

如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

直接插入排序(straight insertion sort)的做法是:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
 
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
 
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
哨兵的作用



算法中引进的附加记录R[0]称监视哨或哨兵(Sentinel)。

哨兵有两个作用:

① 进人查找(插入位置)循环之前,它保存了R[i]的副本,使不致于因记录后移而丢失R[i]的内容;

② 它的主要作用是:在查找循环中"监视"下标变量j是否越界。一旦越界(即j=0),因为R[0].可以和自己比较,循环判定条件不成立使得查找循环结束,从而避免了在该循环内的每一次均要检测j是否越界(即省略了循环判定条件"j>=1")。

注意:

① 实际上,一切为简化边界条件而引入的附加结点(元素)均可称为哨兵。

【例】单链表中的头结点实际上是一个哨兵

② 引入哨兵后使得测试查找循环条件的时间大约减少了一半,所以对于记录数较大的文件节约的时间就相当可观。对于类似于排序这样使用频率非常高的算法,要尽可能地减少其运行时间。所以不能把上述算法中的哨兵视为雕虫小技,而应该深刻理解并掌握这种技巧。

  

 

算法的实现:

 
#include<iostream>
using namespace std;
int  main()
{
     int  a[]={ 98 , 76 , 109 , 34 , 67 , 190 , 80 , 12 , 14 , 89 , 1 };
     int  k=sizeof(a)/sizeof(a[ 0 ]);
     int  j;
     for ( int  i= 1 ;i<k;i++) //循环从第2个元素开始
     {
         if (a[i]<a[i- 1 ])
         {
             int move =a[i];
             for (j=i- 1 ;j>= 0  && a[j]>move;j--)//a[j]若小于要挪动的数,则是循环终止的条件
             {
                 a[j+ 1 ]=a[j];//将a[i]前元素向后挪动一个
             }
             a[j+ 1 ]=move; //此处就是a[j+1]=move;
         }
     }
     for ( int  f= 0 ;f<k;f++)
     {
         cout<<a[f]<< "  " ;
     }
     return  0 ;
}

 

效率:

时间复杂度:O(n^2).

其他的插入排序有二分插入排序,2-路插入排序。

相关文章
|
30天前
|
JSON 前端开发 测试技术
Kimi-k2.6 流式回包乱序后,我这样接入 ​D​М‌X​Α‌РΙ
kimi-k2.6 不止于聊天,其核心价值在于“可执行交付”:统一支持代码生成、长时程任务、Agent协作、文档→技能复用及多格式输出,具备工程级组合能力。它契合企业对“单模型多工位”的刚需——在研发、内容中台等场景中,稳定闭环完成需求拆解、编码、文档整理等多步任务。真正落地需依托DMXAPI网关实现标准化API集成,解决Web路径的不确定性,让模型能力成为可度量、可审计、可持续的生产基础执行层。(239字)
|
6月前
|
数据采集 人工智能 自然语言处理
2025数字人竞争力榜单发布:实时交互数字人全面进化
在数字经济迅速发展的背景下,2025年中国数字人企业的崛起为各行业带来了新的机遇与挑战。本文将深入分析不同数字人企业的特点与全栈技术的应用,提供选型指南,帮助企业识别合适的合作伙伴,从而提升市场竞争力,实现数字化转型与创新发展。
294 8
CAP 理论 —最通俗易懂的解释
CAP 理论是分布式系统的一个基础理论,它描述了任何一个分布式系统最多只能满足以下三个特性中的两个: 1:一致性(Consistency) 2:可用性(Availability) 3:分区容错性(Partition tolerance) CAP 理论听起来十分抽象,本文尝试以生活中的例子并用通俗易懂的语言来解释 CAP 理论的含义。
2773 0
|
9月前
|
算法
三电平逆变器SVPWM控制(无解耦功能)与谐波分析
三电平逆变器的空间矢量脉宽调制(SVPWM)控制方法,重点分析在不使用解耦控制的情况下实现5%谐波含量的技术方案。我们将使用MATLAB/Simulink进行建模和仿真分析。
679 1
|
4月前
|
人工智能 安全 API
一次成功!阿里云百炼 API Key 获取 + 开通全攻略
本文为2026最新阿里云百炼API Key获取与使用指南,涵盖权限要求、开通步骤、创建流程及常见问题。详解主/子账号操作、归属空间选择、Base URL配置、代码与工具调用方式,并强调API Key安全规范与临时密钥使用场景。(239字)
3695 1
|
2月前
|
存储 缓存 Java
深入拆解 Java 内存模型:从原子性、可见性到有序性,彻底搞懂 happen-before 规则
本文深入解析Java内存模型(JMM),系统阐述原子性、可见性、有序性三大核心问题,结合代码示例剖析典型并发缺陷,并详解happen-before八大规则及其在synchronized、volatile、原子类等场景中的应用,助你夯实并发编程基础。
166 2
|
2月前
|
人工智能 供应链 安全
AI时代,谁能为您的“身份与信任”防线做实战体检?
AI时代渗透测试亟需升级:传统漏洞扫描已难应对以“身份窃取”和“信任滥用”为核心的新型攻击。本文提出聚焦身份泄露链与横向移动路径的评估框架,从技术理念、团队能力、合规资质、定制化服务四大维度,指导企业甄选真正具备AI威胁模拟能力的专业服务商。(239字)
|
小程序 JavaScript
微信小程序的事件绑定方式
微信小程序的事件绑定方式
501 4
|
6月前
|
XML 移动开发 前端开发
1.1HTML基础强化
HTML是网页的结构基础,类似Word文档,由块级与内联元素构成层级结构。Web标准分为结构(HTML/XHTML)、表现(CSS)和行为三层,强调分离与规范。W3C制定标准,要求标签小写、闭合、不乱嵌套,提倡语义化标签,提升可读性与SEO。CSS应外链引入,避免行间样式,JS也应外联。HTML5新增语义标签、表单类型与API,支持更丰富交互。页面布局历经table、float到flex发展。前端语义化让机器理解内容,通过合理标签与命名提升可维护性与用户体验。Ajax提交数据可不依赖form,但form在同源策略下仍可跨域提交,因其属于传统导航行为,不受AJAX同源限制影响。
|
算法 机器人