【C语言】插入排序(经典算法,建议收藏!!!)

news2024/11/16 6:01:44

目录

    • 1、原理
    • 2、代码展示
    • 3、解析代码
    • 4、适用场景

1、原理

插入排序(Insertion Sort)是一种简单直观的排序算法,其原理可以简述如下:
1.分已排序区间和未排序区间: 将数组分为已排序区间和未排序区间。初始时,已排序区间只包含数组的第一个元素,而未排序区间包含除第一个元素之外的所有元素。

2.依次将未排序区间中的元素插入到已排序区间中的合适位置: 从未排序区间取出第一个元素,将它插入到已排序区间的合适位置,使得已排序区间仍然保持有序。插入的方式是从已排序区间的末尾开始向前比较,找到插入位置后将元素插入其中。

3.重复步骤2直至未排序区间为空: 重复执行上述插入操作,直到未排序区间中的所有元素都被插入到已排序区间中,即整个数组排序完成。

评价:插入排序是一种稳定的排序算法,其时间复杂度为O(n^2),适用于小型数据集或者已接近有序的数据集。由于其简单直观的实现方式,插入排序通常被用作其他高级排序算法的优化手段,例如快速排序的递归基础情况或归并排序的小规模排序。

2、代码展示

实现一个数组的元素升序排序

#include <stdio.h>
void Insert_sort(int arr[], int size)
{
	int i = 0;
	int j = 0;
	int temp = 0;//存放未排好序区间的第一个数
	for (i = 1; i < size; i++)
	{
		temp = arr[i];
		j = i - 1;//存放已排好序区间的最后一个数下标
		while (j >= 0 && arr[j] > temp)
		{
			arr[j + 1] = arr[j];
			j--;
		}
		arr[j + 1] = temp;
	}
}

void Print(int arr[], int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%-3d", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[10] = { 5,1,3,8,2,6,4,9,10,7 };
	int len = sizeof(arr) / sizeof(arr[0]);
	printf("排序前:");
	Print(arr, len);
	Insert_sort(arr, len);
	printf("排序后:");
	Print(arr, len);
	return 0;
}

输出结果:
在这里插入图片描述

3、解析代码

变量temp是用来临时存放未排好序区间的第一个数,j = i - 1;用来存放已排好序区间的最后一个数下标,while循环是实现从已排序区间的末尾开始向前比较元素大小。

(1)第一轮排序:
首先确定5是已排好序的,我们将1拿来进行插入排序,1进行第一轮排序的第一次排序和5比较,显然5比1大,这是第一次,也是本轮的最后一次比较,所以将1插入到5前面,此时的序列是1,5,3,8,2,6,4,9,10,7然后进入第二轮排序。

(2)第二轮排序:
首先在第一轮排序中1,5这前两位是排好序的(即已排序区间),我们现在将3拿出来和前面排好序的部分进行对比调位,首先在本轮的第一次排序和5比较,显然5比3大,所以直接将3插入到5前面,此时的序列是1,3,5,8,2,6,4,9,10,7,第二次比较,3和1比,显然3比1大,第二次排序仍是1,3,5,8,2,6,4,9,10,7,然后结束本轮排序进入第三轮排序。

(3)第三轮排序:
将8和前面排好序的三个数(即已排序区间)进行对比调位,本轮的第一次比较,8比5大,所以排序原地不动,排序为1,3,5,8,2,6,4,9,10,7,结束本轮排序进入第四轮排序。
(4)剩下的以此类推。

4、适用场景

1.小型数据集: 插入排序在小型数据集上表现良好,因为其时间复杂度为O(n^2),在数量较少的情况下效率较高。

2.几乎已排序的数据: 当数据集接近有序时,插入排序的性能较好。因为插入排序每次只需要将一个元素插入到已排序部分的合适位置,对于几乎已排序的数据,插入操作的次数较少,性能相对较高。

3.稳定性要求: 插入排序是一种稳定的排序算法,即相同元素的相对位置在排序后不会改变。如果对排序结果的稳定性有要求,插入排序是一个不错的选择。

4.部分有序的数据集: 对于部分有序的数据集,插入排序的效率较高。部分有序的数据集意味着某些元素已经处于相对有序的状态,插入排序可以利用这种部分有序性,快速完成排序。

5.排序过程可以被分步进行: 插入排序是一种在线排序算法,可以逐步地将元素插入到已排序部分,因此适用于需要逐步处理数据的场景。

结论:插入排序在处理小型数据集、接近有序的数据集、部分有序的数据集以及对排序稳定性要求较高的情况下表现良好。然而,在处理大型数据集时,插入排序的效率较低,不如一些高效的排序算法如快速排序或归并排序。

总结
插入排序的核心思想是每次从未排序区间中取出一个元素,然后将其插入到已排序区间中的合适位置,使得已排序区间不断扩大,未排序区间不断减小,直至全部元素都被插入到已排序区间中。

那么写到这里,本节内容就结束了,这篇博客花费了很长时间,但写完有满满的成就感,希望能帮助到大家,如果文章有不足的地方,欢迎在评论区留言指正,我们一起学习交流!
希望能得到大家的关注、点赞、评论、收藏! 你的支持是我最大的动力!!

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

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

相关文章

Vue3父组件如何访问子组件属性和方法

本篇内容主要是父组件如何访问子组件的属性和方法 文章目录 子组件 //son.vue代码const list (info) >{console.log(info) }const name ref("XXXX")//子组件向父组件暴露了一个方法&#xff0c;然后父组件就可以去使用子组件里面的一些属性和方法了 //子组件向…

突破网络屏障:掌握FRP内网穿透技术

1.FRP介绍 1.frp是什么 frp 是一款高性能的反向代理应用&#xff0c;专注于内网穿透。它支持多种协议&#xff0c;包括 TCP、UDP、HTTP、HTTPS 等&#xff0c;并且具备 P2P 通信功能。使用 frp&#xff0c;您可以安全、便捷地将内网服务暴露到公网&#xff0c;通过拥有公网 I…

Python 潮流周刊#55:分享 9 个高质量的技术类信息源!

大家好&#xff0c;我是猫哥&#xff0c;今天给大家分享几个高质量的技术类信息源。 本文分享的信息源都是周刊类型的&#xff0c;所谓周刊类&#xff0c;就是以固定每周的频率更新&#xff0c;每期分享很多精华内容的链接。它的特点是信息密度极高&#xff0c;可以节省你去查…

log4j日志打印导致OOM问题

一、背景 某天压测&#xff0c;QPS压到一定值后机器就开始重启&#xff0c;出现OOM&#xff0c;好在线上机器配置了启动参数-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/**/**heapdump.hprof。将dump文件下载到本地&#xff0c;打开Java sdk bin目录下的jvisualvm工具&a…

2024PTA算法竞赛考试编程题代码

目录 前言 题目和代码 L1-006 连续因子 L1-009 N个数求和 L2-004 这是二叉搜索树吗&#xff1f; L2-006 树的遍历 L2-007 家庭房产 L4-118 均是素数 L4-203 三足鼎立 L2-002 链表去重 L2-003 月饼 L2-026 小字辈 L4-201 出栈序列的合法性 L4-205 浪漫侧影 前言 所…

BarTender 常见的使用要点

BarTender 简述 BarTender是由美国海鸥科技&#xff08;Seagull Scientific&#xff09;推出的一款条码打印软件&#xff0c;被广泛应用于标签、条形码、证卡和RFID标记的设计和打印领域。它在全球范围内拥有众多用户&#xff0c;被公认为标签打印方面的全球领先者。BarTender…

把 FolkMQ 内嵌到 SpringBoot2 项目里(比如 “诺依” 啊)

FolkMQ &#xff08;消息中间件&#xff09;支持内嵌、单机、集群、多重集群等多种部署方式。 内嵌版&#xff0c;就相当于 H2 或 SQLite 数据库一样。给一些小项目&#xff08;或者特别需求&#xff09;带来了方便。大项目&#xff0c;则可以使用独立部署的 “单机版” 或 “…

搞懂银行的各类号码 — Account Number, Routing Number 和 Swift Code

1. 前言2. 名词解释 2.1. Debit Card Number 储蓄卡卡号2.2. Account Number 账户号码2.3. Routing Number 路由号码2.4. SWIFT Code SWIFT 号码3. 查找信息 3.1. 支票3.2. 网上银行3.3. 手机银行4. SWFIT Code 4.1. 看懂 SWIFT Code4.2. 询问银行4.3. Google 大神4.4. 部分常用…

24.6.9( 概率dp)

星期一&#xff1a; abc356 D atc传送门 思路&#xff1a;按位与操作&#xff0c;M的非零位对答案一定没有贡献&#xff0c;对M为1的位&#xff0c;考虑有多少k此位也为1 按位枚举&#xff0c;m此位为0跳…

CAS Server Restful接口实现后台认证

背景 对于一些比较复杂定制化登录页的情况下&#xff0c;之前提到过可以自定义修改使用CAS Server提供的登录页这种操作已经明显跟不上复杂定制场景了&#xff0c;所以CAS Server也提供了支持Restful接口&#xff0c;支持服务端后台登陆&#xff0c;对于复杂登陆场景时&#x…

vscode 访问容器的方式

方法一&#xff1a;先连服务器&#xff0c;再转入容器 配置客户机A M1. 客户机A通过 vscode 连接服务器B&#xff0c;再连接容器C 配置vscode的ssh配置文件&#xff1a;~.ssh\config&#xff08;当需要多个不同的连接时&#xff0c;使用 IdentityFile 指定公钥位置&#xff09;…

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题 2024/6/5 13:53 rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh --help rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh lun…

280 基于matlab的摇号系统GUI界面仿真MATLAB程序

基于matlab的摇号系统GUI界面仿真MATLAB程序&#xff0c;输入总数量及摇号需求&#xff0c;进行随机性摇号&#xff0c;并对摇取的号码进行双重随机性数据检测&#xff0c;确定是否符合要求。程序已调通&#xff0c;可直接运行。 280 GUI人机交互 摇号系统GUI界面仿真 - 小红书…

本地搭建支持语音和文本的中英文翻译服务-含全部源代码

实现目标 1、支持文本中英文互译&#xff1b; 2、支持中文语音输入&#xff1b; 3、支持英文语言输入&#xff1b; 进阶&#xff08;未实现&#xff09; 4、优化web界面&#xff1b; 5、优化语音输入js实现逻辑&#xff1b; 6、增加语音输入自纠错模型&#xff0c;纠正语音识别…

【PR2019】怎样批量添加转场效果及修改默认持续时间

一&#xff0c;设置“交叉溶解”效果到所有素材 选择效果&#xff0c;右击“将所选过渡设置为默认过渡”&#xff1a; 框选所有素材&#xff0c;“Ctrl D”&#xff1a; 每个素材中间有有了交叉溶解的效果&#xff1a; 二&#xff0c;修改效果属性 2.1&#xff0c;单个修…

从零开始,手把手教你文旅产业策划全攻略

如果你想深入了解文旅策划的世界&#xff0c;那么有很多途径可以获取知识和灵感。 首先&#xff0c;阅读一些专业书籍也是一个不错的选择。书店或图书馆里有许多关于文旅策划的书籍&#xff0c;它们通常涵盖了策划的基本理论、方法和实践案例。通过阅读这些书籍&#xff0c;你…

激光点云配准算法——Cofinet / GeoTransforme / MAC

激光点云配准算法——Cofinet / GeoTransformer / MAC GeoTransformer MAC是当前最SOTA的点云匹配算法&#xff0c;在之前我用总结过视觉特征匹配的相关算法 视觉SLAM总结——SuperPoint / SuperGlue 本篇博客对Cofinet、GeoTransformer、MAC三篇论文进行简单总结 1. Cofine…

热题系列章节5

169. 多数元素 给定一个大小为 n 的数组&#xff0c;找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [3,2,3] 输出: 3 示例 2: 输入: [2,2,1,1,1,2,2] 输出:…

【C语言】11.字符函数和字符串函数

文章目录 1.字符分类函数2.字符转换函数3.strlen的使用和模拟实现4.strcpy的使用和模拟实现5.strcat的使用和模拟实现6.strcmp的使用和模拟实现7.strncpy函数的使用8.strncat函数的使用9.strncmp函数的使用10.strstr的使用和模拟实现11.strtok函数的使用12.strerror函数的使用 …

【MySQL】聊聊唯一索引是如何加锁的

首先我们要明确&#xff0c;加锁的对象是索引&#xff0c;加锁的基本单位是next-key lock&#xff0c;由记录锁和间隙锁组成。next-key是前开后闭区间&#xff0c;间隙锁是前开后开区间。根据不同的查询条件next-key 可能会退化成记录锁或间隙锁。 在能使用记录锁或者间隙锁就…