插入排序之直接插入排序

简介: 一、基本思想: 依次将每个记录(无序表)插入到一个已排好序的有序表中,得到一个新的,记录增加1的有序表;

一、基本思想:

  依次将每个记录(无序表)插入到一个已排好序的有序表中,得到一个新的,记录增加1的有序表;



二、生活实例:

  向扑克牌中插入新牌,图书馆整理图书;




20161016190616240.png


20161016190605144.png

三、过程:


有n个数,将第一个数看做一个有序表,从第二个开始从后向前比较,第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。


四、代码实现(C)

void StraightInsertSort(ListR,int n)
{int i,j;
    for{(i=2;i<n;i++)                  //外层循环,标识并据顶待比较的数值;
    {  R[0]=R[i];
        j=i-1;    
        while(R[0].key<R[j].key)   //内存循环,查找循环,与前面的数值依次做比较,确定最终位置
         {
            R[j+1]=R[j];
            j--;
               }
      R[j+1]=R[0];
    }
}


在这里主要想和大家分享一下我对岗哨的理解,所以用了《数据结构导论》中的代码。


五、岗哨:R[0]


我们都能从代码中可以看出它的一个作用:进入查找循环之前,保存要给插入的键值R[i],使得找到位置后,不至于因为后移其他位置的键值而导致R[i]中的内容;

   另一个作用就是岗哨的作用:在while循环中“监视”数组下标j是否越界,即,待插入的值R[i]向前比较时是否超出数组的范围。j代表数组中的“键”,即每个值的位置,当j=0时,while循环中的判断条件为  while(R[0].key<R[0].key),此时跳出while循环,将R[0]的查到有序表的最前面;在这里将R[0]设置为岗哨,将判断是否越界(0<=j<=n)和键值之间的比较(R[i]<R[j])融为一体,减少了判断的时间,提高了算法的效率。


六、总结:


稳定;

   空间复杂度O(1)  (需要一个记录的辅助空间)

   时间复杂度O(n2)

   最差情况:反序,需要移动n*(n-1)/2个元素

   最好情况:正序,不需要移动元素

   数组在已排序或者是“近似排序”时,插入排序效率的最好情况运行时间为O(n),插入排序最坏情况运行时间和平均情况运行时间都为O(n2)。













相关文章
|
9月前
|
人工智能 运维 API
PAI-Model Gallery云上一键部署阶跃星辰新模型Step1X-Edit
4月27日,阶跃星辰正式发布并开源图像编辑大模型 Step1X-Edit,性能达到开源 SOTA。Step1X-Edit模型总参数量为19B,实现 MLLM 与 DiT 的深度融合,在编辑精度与图像保真度上实现大幅提升,具备语义精准解析、身份一致性保持、高精度区域级控制三项关键能力;支持文字替换、风格迁移等11 类高频图像编辑任务类型。在最新发布的图像编辑基准 GEdit-Bench 中,Step1X-Edit 在语义一致性、图像质量与综合得分三项指标上全面领先现有开源模型,比肩 GPT-4o 与 Gemin。PAI-ModelGallery 支持Step1X-Edit一键部署方案。
|
人工智能 缓存 vr&ar
big.LITTLE&DynamIQ
big.LITTLE&DynamIQ
309 0
|
存储 消息中间件 NoSQL
每日大厂面试题大汇总 —— 今日的是“京东-后端开发-一面”
文章汇总了京东后端开发一面的面试题目,包括ArrayList与LinkedList的区别、HashMap的数据结构和操作、线程安全问题、线程池参数、MySQL存储引擎、Redis性能和线程模型、分布式锁处理、HTTP与HTTPS、Kafka等方面的问题。
547 0
|
编解码 前端开发 UED
|
前端开发 数据库
文本----富文本数据如何存入到数据库当中,解决方法,看其他大佬写的文章
文本----富文本数据如何存入到数据库当中,解决方法,看其他大佬写的文章
文本----富文本数据如何存入到数据库当中,解决方法,看其他大佬写的文章
|
Java 测试技术 开发者
Spring构造器注入有多好?
Spring构造器注入有多好?
1474 0
Spring构造器注入有多好?
|
Android开发 开发者
flutter 开发环境配置和生命周期学习
flutter 开发环境配置和生命周期学习
|
网络协议 Linux 网络安全
Linux服务器配置指南:网络、用户管理、共享服务及DNS配置详解
Linux服务器配置指南:网络、用户管理、共享服务及DNS配置详解
1383 0
|
缓存 中间件 atlas
Cocos Creator3.8 项目实战(八)2D UI DrawCall优化详解(上)
Cocos Creator3.8 项目实战(八)2D UI DrawCall优化详解(上)
1189 0
C++11特性之std:call_once介绍
std:call_once是C++11引入的新特性,如需使用,只需要#include <mutex>即可,简单来说std:call_once的作用,确保函数或代码片段在多线程环境下,只需要执行一次,常用的场景如Init()操作或一些系统参数的获取等。
510 0

热门文章

最新文章