【数据结构篇】~排序(1)之插入排序

news2024/9/20 8:11:27

排序~插入排序

  • 前言
  • 插入排序
    • 1.直接插入排序(时间复杂度:O(N^2))
      • 1.思想
      • 2.代码
    • 2.希尔排序(时间复杂度:O(N¹∙³))
      • 1.思路
        • 简易证明希尔排序的复杂度
      • 2.代码

请添加图片描述

前言

四大排序,今天解决插入排序
在这里插入图片描述
堆排序和冒泡排序已经写过了,可以看之前的博客!

插入排序

1.直接插入排序(时间复杂度:O(N^2))

在这里插入图片描述

1.思想

插入排序​
基本思想:
直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。​
直接插入排序​
当插入第 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)

2.代码

每次插入前,都插入的是排好序的子数组的下一个元素,那么定义一个end用来记录最后一个有序元素的位置,那end+1就是插入的元素的下标。
先写内层循环,先假设end==0,那要插入的就是arr[1](tmp),进行比较,如果arr[end]>arr[end+1],然后把arr[end]往后挪,再end–,继续往前找,直到找到比tmp小的,然后break,把tmp赋给arr[end+1](因为end下标的元素就是那个比tmp小的数,而原来的end+1位置的数因为往后挪了所以现在end+1下标位置是空的),或者直到找不到,break,把tmp赋给arr[end+1]

void insertsort(int*arr,int n)
{
	for (int i = 0; i < n-1 ; i++)
	{
		int end = i;
		int tmp = arr[end + 1];
		while (end >= 0)
		{
			if (arr[end] > tmp)
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end + 1] = tmp;
	}
}

在这里插入图片描述

2.希尔排序(时间复杂度:O(N¹∙³))

1.思路

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数(通常是gap = n/3+1),把
待排序文件所有记录分成各组,所有的距离相等的记录分在同一组内,并对每一组内的记录进行排序,然后gap=gap/3+1得到下一个整数,再将数组分成各组,进行插入排序,当gap=1时,就相当于直接插入排序。它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的。
希尔排序的特性总结
1. 希尔排序是对直接插入排序的优化。
2. 当 gap > 1 时都是预排序,目的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序
的了,这样就会很快。这样整体而言,可以达到优化的效果。

在这里插入图片描述

简易证明希尔排序的复杂度

这里先假设,gap每次除3共有n个数,gap=n/3那么每组就有3个数,那就共有gap组数据
共3/n组
第一趟预排序(最坏的情况下这3个数都要交换一遍那么消耗就是):(1+2)*3/n=n
共9/n组,每组9个数据
第二趟预排序(最坏的情况下这9个数都要交换一遍那么消耗就是):
(1+2+…+8)*9/n=4n,

直到gap=1,进行最后一次直接插入排序,但是在第二次预排序时,数组已经不可能是最坏的情况了,因为已经经过第一次预排序了,所以第二次的消耗肯定是小于4n的,往后的每次消耗肯定是比算出来的消耗要小的,最后经过大量实验才得出时间复杂度是:O(N¹∙³)

在这里插入图片描述

在这里插入图片描述

2.代码

void shellsort(int* arr, int n)
{
	int gap = n;
	while(gap>1)
	{
	//这里进行预排序,直到gap==1,进行最后一次插入排序,然后直接跳出循环了,这时数组经过插入排序也就排好了
		gap =gap / 3 + 1;
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = arr[end + gap];
			while (end >= 0)
			{
				if (arr[end] > tmp)
				{
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = tmp;
		}
	}
}

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

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

相关文章

C++笔记---继承(上)

1. 继承的简单介绍 1.1 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许我们在保持原有类特性的基础上进行扩展&#xff0c;增加方法(成员函数)和属性(成员变量)&#xff0c;这样产生新的类&#xff0c;称派生类。 继承呈…

如何利用 Smarter Balanced 塑造教育领域的 AI 治理

目录 定义挑战 以人为本的设计引领 融入多样性 探索以学生为中心的价值观 探索效果的层次和不同的影响 部位于加利福尼亚州的Smarter Balanced Assessment Consortium 是一个由会员主导的公共组织&#xff0c;为 K-12 和高等教育领域的教育工作者提供评估系统。该组织成立…

09_Tensorflow2图像处理大赏:让你的图片笑出AI感,惊艳朋友圈!

1. 图像处理案例 1.1 逆时针旋转90度 import tensorflow as tf import matplotlib.pyplot as plt import matplotlib.cm as cm import numpy import osdef show_pic(pic,name,cmapNone):显示图像plt.imshow(pic,cmapcmap) plt.axis(off) # 打开坐标轴为 on # 设置图像标题…

C语言数据类型、变量及数据类型的长度、取值范围

文章目录 一、数据类型介绍1.字符型2.整型3.浮点型4.布尔类型 二、变量1.变量的创建2.变量的分类 三、数据类型的长度(字节)1.sizeof 操作符2.各种数据类型的长度3.sizeof中表达式不计算 四、各种类型的取值范围1.signed和unsigned2.数据类型的取值范围 五、整型提升练习1练习2…

【Obsidian】当笔记接入AI,Copilot插件推荐

当笔记接入AI&#xff0c;Copilot插件推荐 自己的知识库笔记如果增加AI功能会怎样&#xff1f;AI的回答完全基于你自己的知识库余料&#xff0c;是不是很有趣。在插件库中有Copilot插件这款插件&#xff0c;可以实现这个梦想。 一、什么是Copilot&#xff1f; 我们知道githu…

el-input-number设置了min值,希望默认值展示为空

data() {return {editForm: {num: undefined, //input}} } <el-input-number v-model.trim"editForm.num" controls-position"right" :min"1" placeholder"请输入" clearable /> 展示效果如下:

C++中的左值(Lvalue)和右值(Rvalue)详解

C中的左值&#xff08;Lvalue&#xff09;和右值&#xff08;Rvalue&#xff09;详解 在C中&#xff0c;左值&#xff08;Lvalue&#xff09;和右值&#xff08;Rvalue&#xff09;的概念是理解表达式和变量的重要基础。为了提高C的性能和灵活性&#xff0c;C11引入了一些新的…

F1C100S/F1C200S的资料来源说明

文章目录 常用板子开源创客荔枝派榴莲派 我想说是的官网啥资料都没有。但是它的资料又很多&#xff0c;从淘宝或者其他地方能都搜到很多。 http://wiki.lcmaker.com/index.php?titleLC-PI-200S https://github.com/peng-zhihui/Planck-Pi?tabreadme-ov-file#head4 http://do…

时序必读论文04|Non-stationary Transformers:序列平稳性优化【NeurIPS 2022】

我们在先前的一篇文章中已经总结了直接把Transformer应用到时间序列数据存在的问题&#xff0c;其中序列平稳化是transformer也是其他很多模型都未解决好的一个不足。实际上&#xff0c;序列平稳和非平稳是矛盾的存在&#xff0c;这篇文章探索了&#xff1a;原始数据-->平稳…

python基础知识(四)--if语句,for\while循环

目录 if语句 if-else语句 if...elif...else...语句的语法 if嵌套语句语法 while循环 死循环 for循环 例题&#xff1a; 1.请使用*代替&#xff0c;并输出一个正方形的显示效果。 2.逢7必过的游戏 3.九九乘法表 4.案例: 逢七必过游戏 [0, 999] 碰到特殊天气, 150 就…

停车位检测-停车场车位识别

YOLO Parking Spot 概述 停车场获取的图像训练了四个YOLO模型来检测车辆。目标是收集信息&#xff0c;并可能开发一种停车解决方案以改善交通流量并优化空间利用率。通过识别汽车&#xff0c;我们生成了一份报告&#xff0c;其中包含图像细节&#xff0c;如可用停车位的数量、…

Ai+若依(智能售货机运营管理系统---帝可得)--工单管理【08篇---0005:工单管理】

工单管理 需求说明 工单是一种专业名词,是指用于记录、处理、跟踪一项工作的完成情况。 管理人员登录后台系统选择创建工单,在工单类型里选择合适的工单类型,在设备编号里输入正确的设备编号。 工作人员在运营管理App可以看到分配给自己的工单,根据实际情况选择接收工单并…

复现PointNext代码

一、首先第一步&#xff0c;我们就需要下载代码&#xff1a;guochengqian/PointNeXt: [NeurIPS22] PointNeXt: Revisiting PointNet with Improved Training and Scaling Strategies (github.com) 二、然后下载好了之后&#xff0c;然后最关键的一点&#xff0c;这个点进去也要…

【LeetCode每日一题】2024年9月第二周(上)

2024.9.9 中等 难度评分 1333 链接&#xff1a;2181. 合并零之间的节点 &#xff08;1&#xff09;题目描述&#xff1a; &#xff08;2&#xff09;示例 &#xff08;3&#xff09;分析 整体来说&#xff0c;描述还算清晰的题目&#xff0c;找到0节点所框定的区域&#xff0c…

起重机检测系统源码分享

起重机检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

@Valid @NotBlank @NotEmpty @NotNull不生效问题

Spring Boot2.3版本将不再内部依赖validator了 所以导致校验的注解不生效 解决方案&#xff1a;加入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency&…

C++提高--模板(类模板/函数模板)

模板的概念 函数模板(将类型参数化) 函数模板语法 两个函数逻辑非常相似 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; // 模板// 交换两个数 void swapInt(int& a, int& b) {int temp a;a b;b temp; } void swapDouble(doubl…

力扣121-买卖股票的最佳时机(Java详细题解)

题目链接&#xff1a;121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。…

踩最深的坑,教会自己找到需求

目录 引言 1. 寻找合适的需求 2. 海外市场选择 3. 线下热点判断 4. 线上关注度分析 5. 当前竞争分析 6. 未来潜力分析 引言 在经历了刻骨铭心的合伙创业经历后&#xff0c;我意识到是时候该独立出海了。 捡起早已深埋在心里的创业想法&#xff0c;开始独自创业。 这次…

用“女神的一群舔狗”的例子深入理解线程池

假如有一个妹子&#xff08;肤白貌美身材好&#xff09; 同一时间只能谈一个对象&#xff0c;但是新鲜感过去之后就没什么意思了&#xff0c;就想换个对象&#xff0c;但是更换对象的操作效率比较低&#xff0c;需要做到&#xff1a; 1. 想办法和现有对象分手 2.吸引到下一个舔…