当前位置: 首页 > news >正文

插入排序(详解)c++

插⼊排序(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.dtcms.com/a/34187.html

相关文章:

  • 低功耗设计:(3)架构级优化
  • ChātGPT赋能的“SolidWorks工具箱”:重塑3D设计效率新标杆
  • 【Python LeetCode 专题】树
  • 动手学深度学习2025.2.23-预备知识之-线性代数
  • 【C++】list 链表的使用+模拟实现
  • superset
  • CDefView::_InitViewMenuWhenBarrierNotDisplayed函数分析之删除自定义文件夹
  • 一题学会Java入门语法(需C\C++基础)
  • 计算机毕业设计SpringBoot+Vue.jst网上购物商城系统(源码+LW文档+PPT+讲解)
  • UE5销毁Actor,移动Actor,简单的空气墙的制作
  • Linux 命令大全完整版(10)
  • TCP初始化序列号为什么要不一样
  • `sh` 与 `bash` 的区别详解
  • 重学SpringBoot3-怎样优雅停机
  • 什么是HTTP/2协议?NGINX如何支持HTTP/2并提升网站性能?
  • mac 下 java 调用 gurobi 不能加载 jar
  • 计算机毕业设计SpringBoot+Vue.jst网上超市系统(源码+LW文档+PPT+讲解)
  • 大模型微调笔记:对比LoRA、QLoRA、AdaLoRA、LoRA+
  • 【书生大模型实战营】玩转HF/魔搭/魔乐社区-L0G4000
  • python 基础知识全面总结
  • 论文精读: JACS 、 GdAlSi石墨化低维磁性
  • 【结束】JS如何不通过input的onInputFileChange使用本地mp4文件并播放,nextjs下放入public文件的视频用video标签无法打开
  • ubuntu22.04连接github无法访问的问题
  • ubuntu-24.04.1-desktop 中安装 QT6.7
  • go执行java -jar 完成DSA私钥解析并签名
  • CentOS 下安装和配置 HTTPD 服务的详细指南
  • 基于javaweb的SpringBoot酒店管理系统设计和实现(源码+文档+部署讲解)
  • ubuntu docker 安装 deepseek anythingllm/openwebui教程
  • 算法——Z函数
  • 第1章 Vue设计哲学(深度解析版)