当前位置: 首页 > news >正文

数据结构 -- 插入排序(直接插入排序和希尔排序)

插入排序

算法思想

每次将⼀个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。

代码实现
void InsertSort(int A[],int n){int i,j,temp;for(i = 1;i<n;i++){if(A[i]<A[i-1]){temp = A[i];			//用temp暂存A[i]for(j=i-1;j>=0&&A[j]>temp;--j)		//检查所有前面已经排好序的元素A[j+1]=A[j];				//所有大于temp的元素都往后挪一位A[j+1]=temp;					//复制到插入位置}}
}
代码实现(带哨兵)
void Insert(A[],int n){int i,j;for(i = 2;i<=n;i++){if(A[i]<A[i-1]){A[0]=A[i];for(j=i-1;A[0]<A[j];--j)A[j+1]=A[j];A[j+1] = A[0];}}
}

优点:不需要每轮循环都判断一次j>=0

算法效率分析
时间复杂度空间复杂度稳定性
O(1)主要来自对比关键字、移动 元素(若有n个元素 则需要 n-1 趟处理)稳定
最好情况:每次只需要对比一次 不需要移动→O(n)
最坏情况:原本都是逆序排放的 → O(n2)
平均时间复杂度:O(n2)
优化 – 折半插入排序

先用折半查找找到应该插入的位置,再移动元素

当low>high时折半查找停止,并将low之后的元素全部右移,并将A[0]复制到low所在位置

为了保证算法的稳定性,当A[mid]=A[0]时,应继续在mid所指的右边寻找插入位置

void InsertSOrt(int A[],int n){iint i,j,low,high,mid;for(i=2;i<=n;i++){A[0]=A[i];low = 1;high = i-1;while(low<=high){mid = (low+high)/2;if(A[mid]>A[0]) high = mid-1;else low=mid+1;}for(j=i-1;j>=high+1;--j)A[j+1]=A[j];A[high+1]=A[0];}
}

比起“直接插入排序”,比较关键字的次数减少了,但是移动元素的次数没变,整体来看时间复杂度仍未O(n2)

在这里插入图片描述

希尔排序

算法思想

先将待排序表分割成若干形如 L[i, i + d, i + 2d,…, i + kd] 的“特殊”子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

……

在这里插入图片描述

//希尔排序
void ShellSort(int A[],int n){int d,i,j;//A[0]只是暂存单元,不是哨兵,当j<=0时,插入位置已到for(i=d/2;d>=1;d=d/2)for(i=d+1;i<=n;++i)if(A[i]<A[i-d]){A[0]=A[i];for(j = i-d;j>0&&)}
}

目前无法用数学⼿段证明确切的时间复杂度 ,最坏时间复杂度为 O(n2),当n在某个范围内时,可达O(n1.3)

稳定性:不稳定

适⽤性:仅适⽤于顺序表,不适⽤于链表

在这里插入图片描述

相关文章:

  • 短剧系统开发与抖音生态融合:短视频时代的新风口与商业机遇
  • Vue组件化与生命周期:打造灵活高效的前端积木世界
  • 深入解析MySQL中的HAVING关键字:从入门到实战
  • vue2组件对象传参
  • Web攻防-SQL注入数据库类型用户权限架构分层符号干扰利用过程发现思路
  • 每天分钟级别时间维度在数据仓库的作用与实现——以Doris和Hive为例(开箱即用)
  • OverLoCK:先概览,再聚焦。CVPR2025全新主干网络
  • 黑马点评--短信登录实现
  • macOS 安装 PostgreSQL
  • 基于BoxMOT的目标检测与跟踪全流程详解
  • HTA8127内置升压的77W单体声D类音频功放
  • 如何在 Windows 11 或 10 上通过 PowerShell 安装 Docker Desktop
  • 大腾智能 PDM 系统:全生命周期管理重塑制造企业数字化转型路径
  • 使用pip安装ptflops报错
  • Spring用到的设计模式
  • Day125 | 灵神 | 二叉树 | 二叉树中的第K大层和
  • 基于RT-Thread的STM32F4开发第七讲——RTC(硬件、软件)
  • C++构造函数和析构函数
  • 【2025最新】下载安装Anaconda
  • 数据共享中的库表交换怎么做?
  • 如何做网站认证/专业培训
  • 旅游网站的网页设计素材/网络推广和网站推广
  • 无锡手机网站制作费用/互联网去哪里学
  • 网站建设带后台/什么是搜索引擎竞价推广
  • 胶州网站建设/百度后台推广登录
  • 想找人做网站 要怎么选择/深圳关键词优化公司哪家好