【数据结构】插入排序

embedded/2024/12/4 12:49:44/

1.简单插入排序

1.1 基本思想      

        假设待排序记录集合为 R_{1}R_{2},... ,R_{n} 简记为 [1...n]。插入排序方法由n趟组成,假设要进行第 i 趟,此时第 1 ~ i-1 个记录已经插入排好序,第 i 趟是将第 i 个记录插入到有序序列中,使之仍然有序。

 1.2 算法实现

//直接插入排序
void InsertSort(int A[], int n) {int i, j, temp;for(i = 1; i < n; i++) {        //将各元素插入已排好序的序列中if(A[i] < A[i - 1]) {       //若A[i]关键字小于前驱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;        //复制到插入位置}}
}

定义一个变量i指向当前需要处理的元素,并用中间变量 temp 将 i 保存起来(防止移动元素时覆盖掉原有元素)

 依次检查前面已经排好序的元素,如果大于 temp ,则向后挪位,当 j = -1 时遍历完成,将temp 的值复制到插入位置。

1.3 算法效率分析

空间复杂度O(1) 

时间复杂度:主要来自对比关键字、移动元素,若有n个元素,则需要n-1趟排序

        最好情况:n-1趟处理,每一趟只需要对比关键字1次,不用移动元素

                最好时间复杂度——O(n)

        最坏情况:原本为逆序排序

                最坏时间复杂度——O(n^2)

        平均时间复杂度O(n^2)

算法稳定性:稳定

2. 优化——折半插入排序

2.1 思路

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

        当 low > high 时折半查找停止,应将 [low, i - 1] 内的元素全部右移,并将A[0] 复制到 low 所指位置

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

2.2 算法实现

//折半插入排序
void InsertSort(int A[], int n) {int i, j, low, high, mid; for(i = 2; i <= n; i++) {          //依次将A[2]~A[n]插入到前面已排序的序列A[0] = A[i];                   //将A[i]暂存到A[0]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];            //插入操作}
}

 3.希尔排序(Shell Sort)

        希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。

3.1 基本思想

        根据插入排序的特点,当元素比较少时效率比较高;或者,当元素已经基本有序时,效率比较高。开始时,把元素分为几组,组内元素是比较少的,因此组内插入排序效率比较高,每进行一趟后,增加组内元素的个数,与此同时,元素也越来越有序,效率也会越来越高。

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

先追求表中元素部分有序,再逐渐逼近全局有序

3.2 算法实现

//希尔排序
void ShellSort(int A[], int n) {int d, i, j;//A[0]只是暂存单元,不是哨兵,当j<=0时,插入位置已经找到for(d = n/2; d > 0; d /= 2) {        //步长变化for(i = d + 1; i <= n; i++) {    //插入排序if(A[i] < A[i-d]) {          //需将A[i]插入有序增量子表A[0] = A[i];             //暂存在A[0]for(j = i-d; j > 0 && A[0] < A[j]; j -= d) {A[j+d] = A[j];       //记录后移,查找插入位置}A[j+d] = A[0];           //插入}}}
}

 3.3 算法性能分析

空间复杂度O(1)

时间复杂度:和增量序列 d_{1}d_{2}d_{3} ... 的选择有关,目前无法用数学手段证明确切的时间复杂度,最坏时间复杂度为O(n^2),当n在某个范围内时,可达O(n^{1.3})

稳定性:不稳定!

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


http://www.ppmy.cn/embedded/142376.html

相关文章

解决 Ubuntu 20.04 上的 torchvisionnms 运行时错误 详细步骤与分析

解决 Ubuntu 20.04 上的 torchvision::nms 运行时错误: 详细步骤与分析 在Ubuntu 20.04系统中&#xff0c;遇到 RuntimeError: operator torchvision::nms does not exist 错误通常是由于在 Python 环境中 torchvision 包的某些组件没有被正确安装或者无法被正确调用。这类问题…

网络安全内容整理

前言 整理博客&#xff0c;统一到常用的站点。 基础知识 网络安全的三个基本属性&#xff1a;CIA三元组 机密性 Confidentiality完整性 Integrity可用性 Availability 网络安全的基本需求 可靠性、可用性、机密性、完整性、不可抵赖性、可控性、可审查性、真实性 网络安…

揭开广告引擎的神秘面纱:如何在0.1秒内精准匹配用户需求?

目录 一、广告系统与广告引擎介绍 &#xff08;一&#xff09;广告系统与广告粗分 &#xff08;二&#xff09;广告引擎在广告系统中的重要性分析 二、广告引擎整体架构和工作过程 &#xff08;一&#xff09;一般概述 &#xff08;二&#xff09;核心功能架构图 三、标…

以达梦为数据库底座时部署的微服务页面报乱码,调整兼容模式

1.问题描述 部署微服务&#xff0c;文件、代码是延用的mysql类型的&#xff0c;部署前做了部分适配&#xff0c;但是在使用dm数据库进行安装的服务在页面上查询出的数据却都是乱码 2.查询官网&#xff0c;注意到一个参数COMPATIBLE_MODE兼容模式的配置 考虑是延用mysql&…

使用lumerical脚本语言创建定向耦合器并进行数据分析(纯代码实现)

本文使用lumerical脚本语言创建定向耦合器波导、计算定向耦合器的偶数和奇数模式、分析定向耦合器的波长依赖性、分析定向耦合器的间隙依赖性(代码均有注释详解)。 一、绘制定向耦合器波导 1.1 代码实现 # 这段代码主要实现了绘制定向耦合器波导几何结构的功能。通过定义各种…

阅读《基于蒙特卡洛法的破片打击无人机易损性分析》_笔记

目录 基本信息 1 引言 1.1 主要研究内容 1.2 研究必要性&#xff08;为什么要研究&#xff09; 1.3 该领域研究现状&#xff08;别人做了什么/怎么做的&#xff09; 2 主要研究过程&#xff08;我们做了什么&#xff09; 2.1 建立目标仿真模型 2.2 确定毁伤依据 2.3 无…

基于yolov8、yolov5的铝材缺陷检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;铝材缺陷检测在现代工业生产和质量管理中具有重要意义&#xff0c;不仅能帮助企业实时监控铝材质量&#xff0c;还为智能化生产系统提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的铝材缺陷检测模型&#xff0c;该模型使用了大量包含…

【ROS 机器人快速入门】

在使用 ROS 时&#xff0c;一般开发流程可以分为以下几个主要步骤&#xff1a; 1. 安装和环境配置 安装 ROS&#xff1a;通过官方教程安装适合的 ROS 版本&#xff08;如 ROS Noetic、ROS2 Humble&#xff09;。设置环境变量&#xff1a; 在 ~/.bashrc 中添加&#xff1a; sou…