常见排序算法之插入排序

目录

一、直接插入排序

1.1 什么是插入排序

1.2 代码思路

1.3 C语言源码

二、希尔排序

2.0 插入排序的弊端

2.1 什么是希尔排序?

2.2 排序思路

2.3 C语言源码


一、直接插入排序

1.1 什么是插入排序

插入排序是一种简单直观的排序算法,它通过构建有序序列,对未排序数据逐个插入到合适的位置,从而达到排序的目的。

具体操作为:将第一个元素视为已排序部分,然后依次将后面的元素插入到已排序部分,直到所有元素都插入完成为止。

插入排序的时间复杂度为O(N^2),是一种稳定的排序算法。

1.2 代码思路

采取先部分后整体的思路进行讲解

  • 部分
  1. 假设前n个元素均为已排序好的元素,已排序好的最后一个元素的数组下标为end
  2. 将end+1下标对应的值与end对应的值进行比较
    如果大于前一个值,则在end+1的位置插入该值。
    如果小于前一个值,则在end-1的位置插入该值。
  3. 循环比较已经排序好的元素的值与end+1的值,重复插入操作。
    在比较有限次后若发现满足条件,则跳出循环。
    考虑最坏的情况,如果end-1为0时,也就是插入到了数组的第一个位置,则跳出循环。
  • 整体
  1. 从n=0开始循环,假设循环i次,那么每次已排序好的数组最后一个下标就是数组的大小-i
  2. 关键问题是要进行多少次循环?

1.3 C语言源码

void InsertSort(int* a, int n)
{for (int i = 0; i < n-1; i++){int end = i;int tmp = a[end + 1];while (end >= 0){if (a[end] > a[end + 1]){a[end + 1] = a[end];end--;}else{break;}a[end + 1] = tmp;}}
}

二、希尔排序

2.0 插入排序的弊端

插入排序的主要弊端在于其时间复杂度较高。在最坏情况下,插入排序的时间复杂度为O(n^2),因此对于大规模数据集合来说,插入排序的效率较低。尤其是当数组是升序排序时,想要转成降序排序,效率极低。

由此衍生出希尔排序。通过引入增量序列,将整个数据集合分成多个子序列,并对每个子序列进行插入排序,逐渐减小增量,最终实现对整个数据集合的排序。这样做减少了数据的搬移次数,提高了排序的效率。希尔排序通过这种分组的方式,使得较小的元素可以更快地移动到合适的位置,从而减少了插入排序中的反复比较和移动操作,提高了排序效率。

2.1 什么是希尔排序?

希尔排序是一种基于插入排序的排序算法,也被称为“缩小增量排序”。它的基本思想是将待排序的元素分成若干个小组,对每个小组进行插入排序;然后逐渐减小每组的元素个数,继续进行插入排序,直到每组只有一个元素为止。通过这种分组和逐渐减小增量的方式,希尔排序可以在一定程度上减少插入排序的移动操作次数,从而提高排序效率。

2.2 排序思路

采取先部分后整体的思路进行讲解

  • 部分
  1. 设置分组的间隔 gap。
  2. 将每个组看作一个新的数组进行插入排序。
  3. 插入排序的数组下标以及循环结束的条件需要改变,见下图解
  • 整体
  1. 重新设置分组的间隔gap,缩小组数,重复插入排序操作。
  2. 直至gap为1,对整体进行一次插入排序,则最终完成了对数组的排序。
  3. 关于gap的取值选择,目前尚无定论。取gap = gap / 3+1为例
    摘自《数据结构-用面向对象方法与C++描述》-殷人昆
     

2.3 C语言源码

void ShellSort(int* a, int n)
{int gap = n;//总逻辑while (gap > 1){gap = gap / 3 + 1;//多组排序逻辑for (int j = 0; j < gap; j++){//一组排序逻辑for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}a[end + gap] = tmp;}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/18256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LCD屏入门(基于ESP32)

主要参考资料&#xff1a; B站【乐鑫全球开发者大会】DevCon23 #17 &#xff5c;HMI 智能屏解决方案 目录 1.LCD屏幕硬件层2.LVGL驱动层 1.LCD屏幕硬件层 MCU常用的驱动接口在下面&#xff0c;大致可以划分为串口屏和并口屏。 串口屏相较于并行屏优势是占用IO少&#xff0c;相…

【oracle】Oracle RAC中的GNS到底是什么?

本文为云贝教育 刘峰 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载 一、概述 Oracle Grid Naming Service (GNS) 是Oracle Grid Infrastructure的一个重要组件&#xff0c;它提供了一种集中式的命名服务&…

[机缘参悟-191] - 《道家-水木然人间清醒1》读书笔记 -14- 关系界限 - 经济和人格上的独立,走向成熟的必经之路,才能更好的谈其他情感(IT)

目录 前言&#xff1a; 1、“友善的孤独者” 2、“外向的孤独者” 3、道不同不相为谋 4、警惕依赖 5、完整独立的个体 6、不必纠正他人的错误&#xff0c;除非他影响了你 7、不再期待别人能理解自己&#xff0c;只有高维向下兼容你的人才能理解你 8、只有高维和同频的…

ChatGPT魔法,定制个性化提示词!

扮演Prompt创作者的角色 我想让你成为我的Prompt创作者。你的目标是帮助我创建最佳的Prompt&#xff0c;这个Prompt将由 你ChatGPT使用。 你将遵循以下过程&#xff1a; 1.首先&#xff0c;你会问我Prompt是关于什么的。我会告诉你&#xff0c;但我们需要通过不断的重复来改进…

jQuery下载教程

官网&#xff1a;https://jquery.com/ ** ** 点击为压缩版本 将网站打开 界面上邮件保存为js文件即可 在html文件中引入即可 <html> <head></head> <body><script src"./js/jquery-3.6.3.js"> </script> </body> <…

JDK9-21新特性概览(持续更新)

JDK9-21新特性概览 一、JDK9新特性1.1 JEP 102: Process API Updates简介案例风险 1.2 JEP 193: Variable Handles简介案例风险 1.3 JEP 200: The Modular JDK简介案例风险 1.4 JEP 213: Milling Project Coin简介案例1.1 try-with-resources增强1.2 接口中私有方法 1.5 JEP 22…

SpringBoot实现接口防抖的几种方案,杜绝重复提交

插&#xff1a; AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

RK3568平台(camera篇)V4L2查询获取设置设备

一.查询设备能力VIDIOC_QUERYCAP struct v4l2_capability cap; ioctl(fd, VIDIOC_QUERYCAP, &cap) struct v4l2_capability 结构体描述了视频采集设备的 driver 信息。 struct v4l2_capability { __u8 driver[16]; // 驱动名字 __u8 card[32]; // 设备名字 __u8 bus_inf…

详解makefile中的foreach

在 Makefile 中&#xff0c;foreach 函数用于迭代处理一个以空格分隔的列表&#xff0c;并针对列表中的每个元素执行相同的操作。这个函数通常用于循环处理一组变量或文件名&#xff0c;并执行相同的规则或命令。 语法&#xff1a; makefile Copy Code $(foreach var, list, …

ThingsBoard物联网网关在智慧城市数据采集中的应用

智慧城市由监控中心、采集网关、前端采集设备、前端感应执行器组成。 为何选用ThingsBoard作为平台 监控中心为物联网平台&#xff0c;该平台包含云计算、大数据、人工智能、物联网、GIS、云安全等主要模块&#xff0c;具备数据采集、数据交换、超大规模计算、数据分析、数据应…

防火墙如何端口映射?

防火墙端口映射&#xff08;Firewall Port Mapping&#xff09;是一种网络技术&#xff0c;通过对防火墙配置进行调整&#xff0c;允许外部网络用户访问内部网络中的指定端口。该技术使得外部用户可以通过公共网络访问内部网络中的特定服务或应用程序&#xff0c;从而实现远程访…

JavaScript--作用域是什么

作用域是什么 编译原理 在传统的编译语言中&#xff0c;程序中的一段源代码在执行之前会经历三个步骤。成为编译 分词/词法分析 这个过程由字符组成的字符串分解成有意义的代码块&#xff0c;这些代码块成为词法单元。 分词和词法分析之间的主要差异在于词法单元的识别是有…

实战指南:Vue 2基座 + Vue 3 + Vite + TypeScript微前端架构实现动态菜单与登录共享

实战指南&#xff1a;Vue 2基座 Vue 3 Vite TypeScript子应用vue2微前端架构实现动态菜单与登录共享 导读&#xff1a; 在当今的前端开发中&#xff0c;微前端架构已经成为了一种流行的架构模式。本文将介绍如何结合Vue 2基座、Vue 3子应用、Vite构建工具和TypeScript语言…

基于Docker的ROS开发

本文主要介绍如何使用Docker在Windows和Linux环境中部署并使用ROS&#xff0c;通过Docker Container运行ROS&#xff0c;可以方便我们在一个本地环境中运行多个ROS版本。 更多内容&#xff0c;访问专栏目录获取实时更新。 关于ROS的版本 参考ROS1 Distribution Wiki和ROS2 Dis…

nginx源码阅读理解 [持续更新,建议关注]

文章目录 前述一、nginx 进程模型基本流程二、源码里的小点1.对字符串操作都进行了原生实现2.配置文件解析也是原生实现待续 前述 通过对 nginx 的了解和代码简单阅读&#xff0c;发现这个C代码的中间件确实存在过人之处&#xff0c;使用场景特别多&#xff0c;插件模块很丰富…

10款AI工具,让工作生活学习更高效

我看大家都推荐的差不多了&#xff0c;常见好用的PC软件就那些&#xff0c;我不想反复“咀嚼”了&#xff0c;我想另辟蹊径推荐点不一样的&#xff0c;比如10款PC端的AI网站。AI已经全方位“侵入”我们的生活&#xff0c;从AI写作到AI绘画&#xff0c;从AI视频到AI语音&#xf…

Thingsboard规则链:Switch节点详解

在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的高效处理与自动化决策是构建智能系统的核心。作为一款强大的物联网平台&#xff0c;Thingsboard通过其规则引擎为开发者提供了高度灵活的工具&#xff0c;其中Switch节点是实现消息条件路由的关键组件。本文将全方位…

【深度学习】Transformer梳理

零、前言 对于transformer&#xff0c;网上的教程使用记号、术语不一 。 最关键的一点&#xff0c;网上各种图的简化程度不一 &#xff08;画个图怎么能这么偷懒&#xff09; &#xff0c;所以我打算自己手画一次图。 看到的最和善&#xff08;但是不是那么靠谱&#xff0c;我…

黑龙江某市数字孪生地下水监测系统平台项目建设经验

项目背景 地下水是一种特殊而珍贵的资源&#xff0c;它具有不可替代性&#xff0c;与经济发展及人民生活息息相关&#xff0c;针对日趋严峻的水资源危机&#xff0c;如何合理利用有限的水资源&#xff0c;保障国民经济的可持续发展是一个迫切需要解决的问题。 黑龙江某市积极…

eclipse启动时间过长的问题

项目场景&#xff1a; 由于我用eclipse比较习惯&#xff0c;虽然IDEA很好&#xff0c;但是因为收费&#xff0c;所以在个人开发学习过程中一直还是使用eclipse&#xff0c;本文不讨论eclipse与IDEA孰优孰劣问题。 开发环境&#xff1a; 操作系统&#xff1a;Windows 11 22631…