数据结构从入门到精通——直接插入排序

直接插入排序

  • 前言
  • 一、直接插入排序的基本思想:
  • 二、直接插入排序的实例
  • 三、直接插入排序的动图展示
  • 四、直接插入排序的具体代码
    • test.c


前言

直接插入排序是一种简单的排序算法,其工作原理是逐个将待排序元素插入到已排序序列中的适当位置,直到全部元素排序完毕。算法从第二个元素开始,将其与前面的元素进行比较,如果当前元素小于前一个元素,则将其插入到前一个元素之前,否则继续向前比较。重复此过程,直到当前元素找到合适的插入位置。每次插入一个元素后,已排序序列的长度增加1,直到整个序列排序完成。直接插入排序的时间复杂度为O(n^2),在数据量较小时效率较高,但在大规模数据排序中性能不佳。


一、直接插入排序的基本思想:

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

具体步骤为:从第一个元素开始,认为该元素已经被排序;取出下一个元素,在已排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素,将该元素移到下一位置;重复步骤,直到找到已排序的元素小于或者等于新元素的位置;将新元素插入到该位置后;重复以上步骤。

二、直接插入排序的实例

直接插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

假设我们有一个整数列表 [5, 3, 8, 4, 2] 需要进行排序。

首先,我们认为列表的第一个元素 5 已经是一个有序序列。

然后,我们取第二个元素 3,与已排序序列 [5] 进行比较。因为 3 小于 5,所以我们将 3 插入到 5 的前面,得到新的已排序序列 [3, 5]

接下来,我们取第三个元素 8,与已排序序列 [3, 5] 进行比较。8 大于 35,所以我们将 8 插入到序列的末尾,得到新的已排序序列 [3, 5, 8]

然后,我们取第四个元素 4,与已排序序列 [3, 5, 8] 进行比较。4 应该插入到 35 之间,所以我们将 4 插入到适当的位置,得到新的已排序序列 [3, 4, 5, 8]

最后,我们取第五个元素 2,与已排序序列 [3, 4, 5, 8] 进行比较。2 是最小的元素,所以我们将 2 插入到序列的最前面,得到最终的已排序序列 [2, 3, 4, 5, 8]

通过这个过程,我们可以看到直接插入排序是如何逐步构建有序序列的。虽然直接插入排序在大数据集上可能不是最有效的排序算法,但它的实现简单,对于小规模数据或部分有序的数据,直接插入排序是一个很好的选择。

实际中我们玩扑克牌时,就用了插入排序的思想
在这里插入图片描述
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

在这里插入图片描述
直接插入排序的特性总结:

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

直接插入排序的特性总结,在于其简单直观、稳定且空间复杂度低,但同时其时间复杂度较高,特别是在处理大数据集时效率不高。

直接插入排序是一种简单的排序算法,它的基本思想是将一个待排序的元素按其大小插入到已排序的序列中的适当位置,从而得到一个新的、个数增加1的有序序列。这一过程从第一个元素开始,每次将一个元素插入到已排序序列的合适位置,直到所有元素都插入完毕。

直接插入排序的稳定性是其一大特点。稳定性指的是在排序过程中,相等的元素在排序前后的相对位置不变。由于直接插入排序在插入元素时,遇到相等元素会选择将新元素放在已有元素的后面,因此它能够保证稳定性。

此外,直接插入排序的空间复杂度较低,因为它只需要一个额外的存储空间来暂存待插入的元素,不需要像其他排序算法那样开辟额外的数组空间。

然而,直接插入排序的时间复杂度较高,尤其是当处理大数据集时。在最坏的情况下,即待排序序列完全逆序时,直接插入排序的时间复杂度为O(n^2),其中n为待排序元素的个数。这意味着随着数据量的增加,排序所需的时间将呈平方级增长,导致效率低下。

综上所述,直接插入排序具有稳定性好、空间复杂度低的特点,但时间复杂度较高,适用于小规模数据的排序。在实际应用中,可以根据数据的特点和排序需求来选择合适的排序算法。

三、直接插入排序的动图展示

直接插入排序

直接插入排序是一种简单的排序算法。其工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。动图展示这一过程:初始时,已排序序列只包含一个元素,每次从未排序序列中取出一个元素,与已排序序列中的元素比较并插入到正确位置,直到所有元素都插入到已排序序列中,排序完成。此过程通过动画形式展示,能直观理解直接插入排序的工作原理。

四、直接插入排序的具体代码

test.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void InsertSort(int* a,int n)
{
	for (int i = 0; i < n - 1; i++)//因为本函数记录的是下一个位置,所以是n - 1 
	{
		int end = i;
		int tmp = a[end + 1];//记录下一个位置
		while (end >= 0)//从当前位置逐个向前判断
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];//直接拷贝
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;//覆盖
	}
}


void PrintArray(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}
void TestOP()
{
	srand((unsigned int)time(0));
	const int N = 10000;
	int* a = (int*)malloc(sizeof(int) * N);
	for (int i = 0; i < N; i++)
	{
		a[i] = rand();
	}
	int begin1 = clock();
	InsertSort(a, N);
	int end1 = clock();

	printf("InsertSort:%d\n", end1 - begin1);
	free(a);
}
void TestInsertSort()
{
	int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };
	PrintArray(a, sizeof(a) / sizeof(int));

	InsertSort(a, sizeof(a) / sizeof(int));

	PrintArray(a, sizeof(a) / sizeof(int));
}
int main()
{
	TestInsertSort();
	
	TestOP();

	return 0;
}

该段代码实现了插入排序算法。函数InsertSort接受一个整数数组a和数组长度n作为参数。算法通过逐个处理数组中的元素,将其插入到已排序部分的正确位置,从而实现整个数组的排序。在每次迭代中,算法选择当前位置之后的一个元素,并向前搜索已排序部分,直到找到适当的位置插入该元素。算法通过覆盖元素的位置来实现插入,并在循环结束时将当前元素放置到正确的位置。这个过程对数组中的每个元素都重复进行,直到整个数组都被排序。

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

7-初识Keras:轻松完成神经网络模型搭建

声明 本文章基于哔哩哔哩付费课程《小白也能听懂的人工智能原理》。仅供学习记录、分享&#xff0c;严禁他用&#xff01;&#xff01;如有侵权&#xff0c;请联系删除 目录 一、知识引入 &#xff08;一&#xff09;矩阵和向量 1、向量 2、矩阵 &#xff08;二&#xff…

java Flink(四十三)Flink Interval Join源码解析以及简单实例

背景 之前我们在一片文章里简单介绍过Flink的多流合并算子 java Flink&#xff08;三十六&#xff09;Flink多流合并算子UNION、CONNECT、CoGroup、Join 今天我们通过Flink 1.14的源码对Flink的Interval Join进行深入的理解。 Interval Join不是两个窗口做关联&#xff0c;…

001_【基础篇】SpringBoot入门案例创建与实现

要求&#xff1a;使用 Springboot 开发一个 web 程序&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串 hello springboot 使用 springboot 只需要引入一个起步依赖 <dependency><groupId>org.springframework.boot</groupId><artifac…

STP环路避免实验(思科)

华为设备参考&#xff1a;STP环路避免实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 Spanning Tree Protocol&#xff08;STP&#xff09;&#xff0c;即生成树协议&#xff0c;是一种数据链路层协议。主要作用是防止二层环路&#xff0c;并自适应网络变化和故障…

个人网站制作 Part 9 添加发布、管理博客功能 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加博客功能&#x1f528;使用Express和MongoDB&#x1f527;步骤 1: 创建博客模型&#x1f527;步骤 2: 创建博客路由 &#x1f528;使用前端框架&#x1f527;步骤 3:…

什么是零日攻击?

一、零日攻击的概念 零日攻击是指利用零日漏洞对系统或软件应用发动的网络攻击。 零日漏洞也称零时差漏洞&#xff0c;通常是指还没有补丁的安全漏洞。由于零日漏洞的严重级别通常较高&#xff0c;所以零日攻击往往也具有很大的破坏性。 目前&#xff0c;任何安全产品或解决方案…

OxyPlot 导出图片

在 OxyPlot 官方文档 https://oxyplot.readthedocs.io/en/latest/export/index.html 中查看 这里用到的是导出到 PNG 文件的方法&#xff0c;不过用的 NuGet 包最新版&#xff08;2.1.0&#xff09;中&#xff0c;PngExporter 中并没有 Background 属性&#xff1a; 所以如果图…

字符函数与字符串函数

前言 本次博客可以说内容最为多的一次博客&#xff0c;讲解同样很细致大家好好看看 1字符函数 在讲解字符函数时,大家得了解什么是字符吧 普通字符a b c 1 转义字符 \n 换行‘ \t’ 水平制表符\r回车 大家了解即可 在C语言中字符也可以有分类 所以我们先来看看…

软件测试经验与教训

大概在18年的时候&#xff0c;就看过《软件测试经验与教训》的纸制版&#xff0c;里面的一些观点深刻的影响了我&#xff0c;也影响了后来我对测试的思考。最近又一次快速阅读了电子版&#xff0c;还是收获满满。下面精选出10条&#xff0c;和大家分享。 一、测试人员是项目的…

testng测试类第2步

创建xml文件并编写xml文件 并学习其中的参数 1、创建 xml文件 在测试包->右键找到creat TestNG XML 创建xml文件 如果报错就可以粘贴过来 认识原始文件 这里首行是标识&#xff0c;其次是2个参数&#xff0c;name是测试套件的名称&#xff0c;谁的测试套件一般是公司名称…

JAVA实战手册-开篇总述

该专题以实战为出发点&#xff0c;总结概述了实际工作中常用的java知识点&#xff0c;掌握了这些知识点&#xff0c;日常工作开发以及面试都不在话下。 话不多说&#xff0c;直入正题&#xff0c;以下为JAVA知识点概括总结&#xff08;总计涵盖了10大类78小项&#xff09; 针对…

AcWing 727. 菱形——像拼图一样做题

题目描述] 分析&#xff1a; 利用程序根据输入的整数&#xff0c;画出由字符*构成的该整数阶的实心菱形。给出一个示例&#xff1a; n 7 n7 n7。 * * * * * * * * * * * * * * * * * * * * * * * * * 我们将采取拆解问题&#xff0c;通过四个部分的…

Linux编程4.7 网络编程-套接字与地址

1、因特网地址结构 struct in_addr{in_addr_t s_addr; /*ipv4地址*/ }struct sockaaddr_in{short int sin_family; /*Internet地址族&#xff0c;如AF_INET&#xff08;主机字节序&#xff09;*/ unsigned short int sin_port; /*端口号&#xff0c;16…

upload-labs第二关第五关

upload-labs第二关 1、先上传个马试试&#xff0c;看看页面显示什么&#xff0c;要先把上次上传的马删掉哦 2、提示文件类型不正确&#xff0c;在看下提示说是在服务端做了检查 3、那就上传个php格式的&#xff0c;然后呢bp抓包把文件格式改了 4、修改后的 5、修改后发现不…

【物联网】Modbus 协议及应用

Modbus 协议简介 QingHub设计器在设计物联网数据采集时不可避免的需要针对Modbus协议的设备做相关数据采集&#xff0c;这里就我们的实际项目经验分享Modbus协议 简介 Modbus由MODICON公司于1979年开发&#xff0c;是一种工业现场总线协议标准。1996年施耐德公司推出基于以太…

ansible 运维自动化

pxe 一键安装操作系统 操作系统只是提供一个平台 lnmp 需要多软件协同完成的一个简单项目 服务器正常运行 日常运维 巡检 服务器上的软件正常运行 zabbix 普罗米修斯 系统调优&#xff0c;架构调优 前言 运维自动化 云计算核心职能 搭建平台架构 …

TCPIP协议总结

一、TCP的三次握手 TCP连接的建立时&#xff0c;双方需要经过三次握手&#xff0c;而断开连接时&#xff0c;双方需要经过四次分手&#xff0c;那么&#xff0c;其三次握手和四次分手分别做了什么呢&#xff1f;又是如何进行的呢&#xff1f; 通常情况下&#xff0c;建立连接的…

从零开始学习如何使用 Postman 请求头

当你在使用 Postman 发送请求时&#xff0c;请求头&#xff08;Headers&#xff09;是你可以包含在 HTTP 请求中的重要部分之一。请求头包含了关于请求的元数据信息&#xff0c;这些信息对于服务器来处理请求是非常重要的。下面是一份详细的图文介绍&#xff0c;说明了如何在 P…

电商数据采集效率开挂【Python电商数据采集API接口】

数据监测 监测线上电商平台的商品、店铺数据&#xff0c;包括商品销量/库存/价格/店铺等级/发货地/促销活动等信息&#xff0c;支持十多个国内主流电商平台。 在线维权 实现多平台在线一键投诉&#xff0c;与各大电商投诉平台系统对接&#xff0c;实时同步投诉进展。 渠道管…

C# visual studio 2022 学习2

类成员&#xff1a; 1.字段成员 字段只是类中声明的一个变量&#xff0c;用来在对象中存储信息。 &#xff08;1&#xff09;.静态字段 使用static关键字修饰的就是静态字段&#xff0c;静态字段属于类而不属于某个类实例&#xff0c;对它的访问使用“类名.静态字段名” &…