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

排序~插入排序

  • 前言
  • 插入排序
    • 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.ppmy.cn/embedded/111215.html

相关文章

可测试,可维护,可移植:上位机软件分层设计的重要性

互联网中&#xff0c;软件工程师岗位会分前端工程师&#xff0c;后端工程师。这是由于互联网软件规模庞大&#xff0c;从业人员众多。前后端分别根据各自需求发展不一样的技术栈。那么上位机软件呢&#xff1f;它规模小&#xff0c;通常一个人就能开发一个项目。它还有必要分前…

Redis 是否存在线程安全问题:深入解析与技术分析

引言 Redis 作为一种高性能的内存键值数据库&#xff0c;广泛应用于各种场景中&#xff0c;包括缓存、消息队列、排行榜等。在高并发和分布式环境下&#xff0c;程序的线程安全问题尤为关键。很多开发者都会问&#xff1a;Redis 是否存在线程安全问题&#xff1f; 为了回答这个…

Mac强制删除文件,碰上“拖拽到废纸篓”无法删除时怎么办?

我们都特别喜欢Mac&#xff0c;不仅是因为它漂亮的外观&#xff0c;还有它的运行顺畅、界面友好。然而&#xff0c;就像所有技术产品一样&#xff0c;有时它也会让我们头疼——比如&#xff0c;当某个文件无论如何都删不掉时。你可能遇到过这样的情况&#xff1a;尝试删除一个文…

深度学习(十一)-PaddlePaddle

PaddlePaddle PaddlePaddle&#xff08;Parallel Distributed Deep Learning&#xff0c;中文名飞桨&#xff09; 是百度公司推出的开源、易学习、易使用的分布式深度学习平台 源于产业实践&#xff0c;在实际中有着优异表现 支持多种机器学习经典模型 优点 易用性。语法简…

jmeter压力测试,通过LLM利用RAG实现知识库问答,NEO4J部署,GraphRAG以知识图谱在查询时增强提示实现更准确的知识库问答(9/7)

前言 这周也是杂七杂八的一天&#xff08;高情商&#xff1a;我是一块砖&#xff0c;哪里需要往哪里搬&#xff09;&#xff0c;首先是接触了jemter这个压力测试工具&#xff0c;然后帮公司的AIGC项目编写使用手册和问答手册的第一版&#xff0c;并通过这个平台的智能体实现知识…

代码随想录算法训练营第45天 | LeetCode115.不同的子序列、 LeetCode583.两个字符串的删除操作、LeetCode72.编辑距离

目录 LeetCode115.不同的子序列 LeetCode583.两个字符串的删除操作 LeetCode72.编辑距离 LeetCode115.不同的子序列 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 10^9 7 取模。 思路&#xff1a;昨天做了一道判断…

jdk环境变量配置+eclipse配置jdk

文章目录 安装jdkjdk环境变量配置eclipse里边配置jdkeclipse覆盖率插件——EclEmma的安装和使用 安装jdk 在安装前可以先建两个文件夹&#xff0c;注意不要文件夹用英文&#xff0c;不要用中文&#xff0c;如图&#xff1a; 然后我们开始安装 然后就看我们有没有安装成功…

如何测试你购买的IP的丢包率是否正常

在数字化时代&#xff0c;网络的稳定性和可靠性对于在线活动至关重要。无论是企业级应用、游戏服务器、还是日常的网络使用&#xff0c;一个高丢包率的IP地址都会严重影响用户体验和数据传输效率。因此&#xff0c;测试并确保购买的IP地址丢包率在正常范围内&#xff0c;是保证…

多线程学习篇一:启动多线程的三种方式

1. 继承 Thread 类 Slf4j public class MyThread extends Thread {Overridepublic void run() {log.info("MyThread run ...");}public static void main(String[] args) {MyThread myThread new MyThread();myThread.start();} } 2. 实现 Runnable 接口 Slf4j pu…

ubuntu24.04 为什么扬声器没有声音,但是戴上耳机有声音

扬声器在 Ubuntu 24.04 下没有声音&#xff0c;但耳机有声音&#xff0c;可能是由于以下几个原因造成的&#xff1a; 1. 输出设备设置问题 系统可能将默认输出设备设置为耳机&#xff0c;而非扬声器。你可以检查或更改音频输出设备&#xff1a; 打开“设置” -> “声音”…

python爬虫爬取淘宝商品比价||淘宝商品详情API接口

最近在学习北京理工大学的爬虫课程&#xff0c;其中一个实例是讲如何爬取淘宝商品信息&#xff0c;现整理如下&#xff1a; 功能描述&#xff1a;获取淘宝搜索页面的信息&#xff0c;提取其中的商品名称和价格 探讨&#xff1a;淘宝的搜索接口 翻页的处理 技术路线:requests‐…

已开源!无限场景生成和高效数据迁移:3D金字塔扩散模型斩获ECCV24 Oral

作者主页&#xff1a; https://yuheng.ink/ 论文标题&#xff1a; Pyramid Diffusion for Fine 3D Large Scene Generation 导读&#xff1a; 本文通过设计一种新颖的金字塔扩散模型&#xff0c;为三维室外场景生成提供了一种从粗到细的策略。本文对金字塔扩散模型进行了大量实…

【FFMPEG】FFplay音视频同步分析(下)

audio_decode_frame函数分析 首先说明一下&#xff0c;audio_decode_frame() 函数跟解码毫无关系&#xff0c;真正的解码函数是 decoder_decode_frame 。 audio_decode_frame() 函数的主要作用是从 FrameQueue 队列里面读取 AVFrame &#xff0c;然后把 is->audio_buf 指向…

【docker】了解什么是Docker

一、前言 最近&#xff0c;在学习如何部署项目的时候&#xff0c;老是出错误&#xff0c;然后朋友推荐了去学一下docker,然后自己就去学了【尚硅谷】的关于docker的教程视频&#xff0c;学完之后&#xff0c;感觉docker真的强&#xff0c;可以把我们做好的app的进行跨平台、快速…

Golang path/filepath包详解:高效路径操作与实战案例

Golang path/filepath包详解&#xff1a;高效路径操作与实战案例 引言基础用法Abs 函数Base 函数Clean 函数Dir 函数Ext 函数FromSlash 和 ToSlash 函数 基础用法Abs 函数Base 函数Clean 函数Dir 函数Ext 函数FromSlash 和 ToSlash 函数 路径操作Join 函数Split 函数Rel 函数Ma…

LeetCode HOT100系列题解之最大正方形(6/100)

题目&#xff1a;最大正方形. - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 第一种方法&#xff1a;前缀和二分答案&#xff08;暴力优化&#xff09;我感觉比官方给的暴力好一点 时间复杂度&#xff1a; 暴力优化1&#xff1a;通过前缀和减少判断1出现得次数…

php redis session 多DB操作时异常记录

php redis session 多DB 操作异常记录 背景:某个TP项目使用redis 保存session,同时redis 内也保存了其他缓存数据,为了区分session 数据跟缓存数据,项目将session 数据保存于DB 0,缓存数据保存于其他DB; 问题:某些情况下会出现登录过期异常,但是手动查询redis 相关session 是…

misc音频隐写

一、MP3隐写 &#xff08;1&#xff09;题解&#xff1a;下载附件之后是一个mp3的音频文件&#xff1b;并且题目提示keysyclovergeek;所以直接使用MP3stego对音频文件进行解密&#xff1b;mp3stego工具是音频数据分析与隐写工具 &#xff08;2)mp3stego工具的使用&#xff1a;…

leetcode 108.将有序数组转换为二叉搜索树

思路一&#xff1a;在数据结构中&#xff0c;我们曾经学到过这样一个东西&#xff1a;二分搜索树&#xff08;不是BST&#xff09;&#xff0c;这个树是根据二分搜索的搜索顺序而画出来的树。这棵树的特点就是它是绝对平衡的&#xff0c;并且是有序的。既然我们可以根据二分搜索…

【SpringCloud】微服务架构演进与Spring Cloud简介

目录 概述认识微服务单体架构集群和分布式架构集群和分布式 微服务架构分布式架构与微服务架构 微服务带来的挑战 微服务解决方案 - Spring Cloud什么是 Spring CloudSpring Cloud 版本Spring Cloud 和 Spring Boot 的关系Spring Cloud 实现方案Spring Cloud NetflixSpring Clo…