插入排序(详解)c++

news/2025/2/24 11:33:04
插⼊排序(Insertion Sort)类似于玩扑克牌插牌过程,每次将⼀个待排序的元素按照其关键字⼤⼩插⼊到前⾯已排好序的序列中,按照该种⽅式将所有元素全部插⼊完成即可
                    

算法思想:

把待排序元素插入到已排序的序列中。想象一下一张一张整理扑克牌的过程。
  • 把前面比我大的统一向后移动,移动到不能在移动的时候,把数放的空出来的格子就可以了

代码:

测试排序:P1177 【模板】排序 - 洛谷

#include <iostream>
using namespace std;

const int N = 1e5 + 10;

int n;
int a[N];

void insert_sort()
{
	// 依次枚举待排序的元素
	for (int i = 2; i <= n; ++i) //第一个位置默认就是有序的
	{
		//必须要把a这个位置提前保存一下,因为是把i位置前面比我大的数统一右移
		//如果i-1这个位置就比我大,i-1这个位置就会右移
		//右移之后就会把a[i]这个数覆盖掉,所以我们要提前把a这个数保存
		int k = a[i];
		//前面比k大统一右移
		int j = i - 1;
		while (j >= 1 && a[j] > k) //当前面还有元素且前一个数比当前数大
		{
			a[j + 1] = a[j];
			--j;
		}
		//程序执行到这,j位置的值小于等于k,空位置在j+1
		a[j + 1] = k;
	}
}

int main()
{
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a[i];

	insert_sort();

	for (int i = 1; i <= n; ++i) cout << a[i] << " ";
	cout << '\n';

	return 0;
}

时间复杂度

  • 当整个序列有序的时候,插⼊排序最优,此时时间复杂度为 O(n比如升序12345,仅需从前往后扫描数组一遍就结束了;
  • 当整个序列逆序的时候,每个元素都要跑到最前⾯,时间复杂度为 O(n*n)比如54321,拿4和前面的5作比较,5要向后移动1位,移动了1次,接下来3和前面的数比较的时候,前面的数要移动2次,到2,前面的数要移动3次,到1,前面的数要移动4次,数据范围是5要执行1+2+3+4次,如果数据范围是n就要执行1+2+…+n-1次,是个等差数列求和,总体求和完是N方级别的,我们考虑算法的时候,每次考虑都是最差情况,因此它的时间复杂度就是O(N*N)

http://www.niftyadmin.cn/n/5864273.html

相关文章

【Python量化金融实战】-第1章:Python量化金融概述:1.2 Python在量化金融中的优势与生态

本小节学习建议&#xff1a;Python在量化金融领域的统治地位不仅体现在当前的技术栈中&#xff0c;更在于其持续进化的能力。随着AI、区块链等新技术的融合&#xff0c;Python开发者将始终处于金融创新的最前沿。建议学习者从构建完整的策略生产线开始&#xff0c;逐步深入高频…

【HarmonyOS Next】鸿蒙状态管理V2装饰器详解

【HarmonyOS Next】鸿蒙状态管理V2装饰器详解 一、为什么需要V2状态管理装饰器&#xff1f; 首先我们需要了解什么是状态管理&#xff1f;在鸿蒙应用开发中&#xff0c;状态管理指的是&#xff0c;管理数据变化去刷新UI的整个过程。 举个例子&#xff0c;比如在界面中标题文…

day58 第十一章:图论part08

拓扑排序精讲 关键&#xff1a; 先找到入度为0的节点&#xff0c;把这些节点加入队列/结果&#xff0c;然后依次循环再找。 #include <iostream> #include <vector> #include <queue> #include <unordered_map> using namespace std; int main() {int …

MybatisPlus-注解

TableName设定表名 1. MyBatis-Plus在确定操作的表时&#xff0c;由BaseMapper的泛型决定&#xff0c;即实体类型决 定&#xff0c;且默认操作的表名和实体类型的类名一致 2. 若实体类类型的类名和要操作的表的表名不一致&#xff0c;访问数据库表将会报错 3. 在实体类上添加…

链表和STL —— list 【复习笔记】

1. 链表 1.1 链表的定义和类型 和顺序表一样&#xff0c;链表也是一种线性表&#xff0c;线性表存储结构为链式存储就是链表 链式存储不仅要保存数据元素&#xff0c;还要保存数据元素间的关系&#xff0c;这两个部分信息形成了结点。结点有两个域&#xff1a;数据域&#x…

mysql系列9—mysql的MVCC机制

背景 mysql提供了读未提交、读已提交、可重复读、串行化四种隔离级别&#xff0c;默认的隔离界别为可重复读。其中&#xff0c;不可重复度场景下&#xff0c;每次直接读取最新记录(即使事务未提交)&#xff1b;串行化对于所有的读写都加锁&#xff0c;因此&#xff0c;对二者不…

hive开窗函数边界值ROWS BETWEEN 和 RANGE BETWEEN区别

目录 一、概念 1.rows between ... and ... 2.range between ... and ... 二、语法 1.关键词含义 一、概念 1.rows between ... and ... rows&#xff1a;指以行号来决定frame的范围&#xff0c;是物理意义上的行。 2.range between ... and ... range&#xff1a;指以当…

DeepSeek从入门到精通

1_DeepSeek从入门到精通 (1).pdf官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供1_DeepSeek从入门到精通 (1).pdf最新版正式版官方版绿色版下载,1_DeepSeek从入门到精通 (1).pdf安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123…