【数据结构初阶】C语言从0到1带你了解直接插入排序

news2025/1/8 12:36:40

 🌟hello,各位读者大大们你们好呀🌟

🍭🍭系列专栏:【数据结构初阶】

✒️✒️本篇内容:深入剖析直接插入排序

🚢🚢作者简介:计算机海洋的新进船长一枚,请多多指教( •̀֊•́ ) ̖́-

直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定

直接插入排序是一种简单的插入排序法,其基本思想是:

按照待排序的值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。 

我们可以通过下面的一个动图来理解:

  • 通俗的说法,按大小值插入到从第一个数开始组成的有序序列中
  • 书本上的说法为,当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

下面我们来尝试构建一个直接插入排序

1.假设有 [0, end] 个数已经为有序数列,我们需要把 a[end+1] 的数保存起来,我们使用 tmp 将上数保存

void InsertSort(int* a, int n)//数组a的指针,n个数
{
    int end;
	int tmp = a[end + 1];
}

 2. 对比数组中的数,确定tmp的插入位置

例:(以升序为例)需要插入值为3,与 end 对比小于5,5向右移将3的值覆盖,end指向数左移 - 指向4,重复上述过程,待到满足停止条件为止;

 3.两种情况会终止:第一种,某个数比end小,将插入数放在某个数的后面;第二种,end已经等于零了(不能使end小于0),代码如下

		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)//end不能小于0
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];    //对比end指向数,若大于插入数tmp,则将end指向数右移将右数覆盖(最右数为tmp储存数)
				--end;    //end指向数左移
			}
			else
			{
				break;
			}
		}

        //通过上面的循环,找到某个数比end小,将插入数放在某个数的后面
        当end=0时,进入最后一次循环,如果a[end] > tmp,end将变为-1,将在a[-1+1]=a[0]处插入tmp
		a[end + 1] = tmp;    

 至此,我们已经完成了单趟的插入排序,接下来就是加入循环,完成多次插入排序,使数组变为有序数组

4.我们的要做的是:从第一个数开始排,如果数组有 n 个数,我们需要排 n 趟,使数组成为有序数列。

通过观察,我们发现只要控制住 end ,这个数组就控制住了。end为第1个数,就用第2个数作为tmp,前两个数组成有序数列;end为第2个数,就用第3个数作为tmp,前三个数组成有序数列;如此类推,得出结论就是我们只需要将 end 的值从0到增加 n-1 即可。

至于为什么是 n-1,我们知道数组是从 a[0]开始存数的,a[n]是没有存数的,如果 end=n,将会造成越界访问

我们可以通过循环来控制 end,代码如下

#include "Sort.h"

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

5.我们将上述代码补充完整,进行一次实验

sort.h

#include <stdio.h>

void InsertSort(int* a, int n);

sort.c

代码如上所示

test.c

#include "Sort.h"

void Print(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
}

void TestInsertSort()
{
	int a[] = { 34,56,25,65,86,99,72,66 };
	InsertSort(a, sizeof(a) / sizeof(int));
	Print(a, sizeof(a) / sizeof(int));
}

int main()
{
	TestInsertSort();

	return 0;
}

结果如下


  🌹🌹直接插入排序大概就讲到这里啦,博主后续会继续更新更多数据结构的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪 

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

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

相关文章

等保整改之开启Nacos认证-漏扫发现我们使用Nacos时存在未授权访问的漏洞

背景 还是之前的一个小项目&#xff0c;部署在专网中&#xff0c;等保在做了一次漏扫后&#xff0c;说是有个高危漏洞要求整改。打开漏洞扫描报告后&#xff0c;总体网络风险级别为&#xff1a;比较危险&#xff1a; nacos未授权访问漏洞 &#xff0c;漏洞详细信息如下&#x…

Linux基本用户操作

1.查看用户名 指令&#xff1a;whoami 在Linux下查看本用户下的用户名&#xff0c;可以在普通用户和root超级用户下操作&#xff0c;如下&#xff1a; 其实&#xff0c;查看用户名也可以不用指令就能查看&#xff1a; 箭头所指的就是用户名&#xff0c;root用户名就是root。 2.…

第2章 持久化初始数据到指定表

004 AuthorityScopeEnum、Role、Topic、TaskInfoDto、TasksQz AuthorityScopeEnum&#xff1a;该枚举定义了6种当前程序的访问权限&#xff0c;前程序通过该枚举实例选定其中(NONE(-1&#xff1a;无任何权限)/Custom(1&#xff1a;自定义权限)/MyDepart(2&#xff1a;本部门权…

Typescript:(一)基本使用

TypeScript 定义&#xff1a;Typescript是拥有类型的JavaScript超集 它可以编译成普通&#xff0c;干净&#xff0c;完整的JavaScript代码 我们可以将TypeScript理解成加强版的JavaScript。 JavaScript所拥有的特性&#xff0c;TypeScript全部都是支持的&#xff0c;并且它紧…

Linux系统挂载命令mount(U盘、移动硬盘、光盘)

Linux系统不像windows系统可以自动识别加载新设备&#xff0c;Linux系统需要手动识别&#xff0c;手动加载。Linux中一切皆文件。文件通过一个很大的文件树来组织&#xff0c;文件树的根目录是&#xff1a;/&#xff0c;从根目开始录逐级展开。这些文件通过若干设备铺展开。 命…

BCG 对话框表格控件CBCGPGridCtrl显示子

1、1、MFC窗口中拖放Picture Control 2、 void CSimpleGridSampleDlg::_FillGrid() { CWaitCursor wait; // Create grid tree: CRect rectClient; GetClientRect(rectClient); m_wndGrid.Create(WS_CHILD | WS_VISIBLE, rectClient, this, ID_GRID); m_wndGri…

SAR回波的多普勒特性

专栏目录链接: SAR成像专栏目录 今天我们来看看SAR回波的多普勒特性。 首先推导下正侧视下SAR回波的多普勒频率公式,前提条件: 正侧视不考虑平台运动的不稳定性忽略地球曲率忽略地球自转的影响 根据多普勒效应原理可得SAR回波的多普勒频率(可以回顾下:《雷达导论PART IV.…

C++之二叉搜索树详解

文章目录前言一、二叉搜索树的概念二、二叉搜索树的操作1.节点类2.二叉搜索树类内部定义3.遍历操作4.构造函数5.拷贝构造函数6.赋值运算符重载7.析构函数8.插入函数非递归实现递归实现9.删除函数非递归实现递归实现10.查找函数非递归实现递归实现三、二叉搜索树的应用K模型KV模…

索引和事务

文章目录 1.索引的含义以及应用 2.索引的查看、创建 3.带主键的索引底层结构 4.事务的含义 5.事务的特性 6.JDBC 一.索引的含义及应用 1.索引我们可以认为是文章的目录&#xff0c;有了它&#xff0c;我们可以更加快速的 查看到我们想要查找的内容。 2.并不是说我们加了索引&…

一周侃 | 周末随笔及推荐

前言 每周一次的闲聊胡侃又来啦&#xff01;这一周世界发生了许多大事&#xff0c;从举世瞩目的中美元首会晤到新的防疫政策二十条出来之后各地防疫政策的转变&#xff0c;再到俄乌冲突持续进行&#xff0c;联大通过俄罗斯赔偿计划……百年未有之大变局正加速演进&#xff0c;…

【k8s】8、service详解

文章目录一、Service详解1、Service介绍1.1 userspace模式1.2 iptables 模式1.3 ipvs模式2、Service类型3、Service使用3.1 实现环境准备3.2 Cluster类型的Service3.2.1 cluster类型的生成ip3.2.2 cluster类型不生成ip3.3 NodePort类型的service3.4 LoadBalancer类型的Service3…

【MySQL】MySQL体系结构与内部组件工作原理解析(原理篇)(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

GEE两行代码下载任意范围影像python API

GEE三行代码下载任意范围影像 前不久&#xff0c;吴秋生博士更新了geemap&#xff0c;现在能更方便地下载影像了最新的下载再也不受有限的Google Drive、图像过大会自动分割、缓慢的下载速度影响了。 有兴趣的同学可以see this: https://geemap.org/notebooks/118_download_i…

蓝牙传输 LE Audio技术

蓝牙 蓝牙(Bluetooth)技术&#xff0c;实际上是一种短距离无线电技术&#xff0c;利用"蓝牙"技术&#xff0c;能够有效地简化掌上电脑、笔记本电脑和移动电话手机等移动通信终端设备之间的通信&#xff0c;也能够成功地简化以上这些设备与因特网Internet之间的通信&…

react(受控组件、生命周期、使用脚手架)

目录 使用脚手架 其他&#xff1a; 学习js: mdn 文档 MDN Web Docs 在react官方文档的 CDN 链接里下载最新的react版本react官网&#xff1a;React 官方中文文档 – 用于构建用户界面的 JavaScript 库 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 1. 受控组件…

ES6 入门教程 15 Proxy 15.3 Proxy.revocable() 15.4 this 问题 15.5 实例:Web 服务的客户端

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程15 Proxy15.3 Proxy.revocable()15.4 this 问题15.5 实例&#xff1a;Web 服务的客户端15 Proxy 15.3 Proxy.revocable() …

BLDC的列子2

1.三相采样电流的采集以u相为举例。 采集下桥臂I-V的电压。在除以采样电阻。就可以得到采样电流。但由于I-V的电压比较小。 需要一个放大电路把电压放大ADC才采集的到。 放大后的电压是AMP_IU.用ADC去采集这个电压。从而算出I_V的电压。 在电机停止的时候也会有微小的电压。…

Azure 深入浅出[2] --- App Service的部署并查看应用Log

假设读者已经申请了Azure的免费订阅的账户。如果想部署一个前端NodeJS的服务到Azure的App Service应该如何部署并查看应用程序本身的日志呢&#xff1f;笔者在这边文章就带大家快速看一下。 1.环境准备 安装Visual Studio Code以及在Visual Studio Code里面安装Azure App Ser…

文件上传漏洞 | iwebsec

文章目录靶场搭建文件上传漏洞前端JS过滤绕过文件名过滤绕过Content-Type过滤绕过文件头过滤绕过.htaccess文件上传文件截断上传条件竞争文件上传靶场搭建 参考文章https://juejin.cn/post/7068931744547733517出现个小问题&#xff0c;我的端口冲突了&#xff0c;所以换了一个…

Linux-unbuntu修改apt源

本文介绍如何将ubuntu的apt源修改为清华大学的镜像源 主要是修改/etc/apt/source.list的文件&#xff0c;并且使用sudo apt-get update来刷新源 修改apt源 unbuntu安装好之后&#xff0c;apt的源是us的&#xff0c;这样下载速度比较慢 apt源的地址放在/etc/apt/source.list中…