数据结构|排序算法(二)插入排序 希尔排序 冒泡排序
一、插入排序
1.算法思想
插入排序(Insertion Sort)是一种简单的排序算法,其基本思想是:将待排序的元素插入到已经有序的序列中,从而逐步构建有序序列。
具体过程如下:
- 把待排序的数组分为已排序和未排序两部分。初始时,已排序部分只有第一个元素,即数组的第一个元素被认为是已经有序的。
- 从第二个元素开始,也就是未排序部分的第一个元素,将其与已排序部分的元素从后往前依次比较(因为从后往前越来越有序,则越快)。
- 如果当前元素(未排序部分的元素)小于已排序部分的某个元素,就将该元素往后移动一位,为当前元素腾出位置。
- 重复步骤 3,直到找到一个已排序元素小于或等于当前元素,或者已经比较到了已排序部分的第一个元素。
- 将当前元素插入到合适的位置,这样就将一个未排序元素插入到了已排序序列中,使得已排序序列的长度增加 1。
- 对未排序部分的下一个元素重复步骤 2 到 5,直到所有元素都被插入到已排序序列中,此时整个数组就完成了排序。
插入排序就像人们平时整理扑克牌一样,每次从手中的未整理牌中拿起一张,然后将其插入到已整理好的牌中的合适位置。
2.代码实现
//插入排序
void InsertSort(int* arr, int len)
{int tmp,i,j;for (i = 1; i < len; i++)//i是当前要处理的数字的下标{tmp = arr[i];//取出当前要插入的元素//遍历已排序的部分for (j = i - 1; j >= 0; j--)//从i的前一个开始找位置,从后往前找,找比当前数字小的,同时移动数据{if (arr[j] > tmp){arr[j + 1] = arr[j];//将比tmp大的元素后移}else{//arr[j + 1] = tmp;break;}}arr[j + 1] = tmp;//将tmp插入正确位置,放到比tmp小的元素的后面}
}
3.复杂度分析
该算法在最好情况下(数组已经有序)时间复杂度为O(n),越有序越快,完全有序为O(n);在最坏情况下(数组逆序)时间复杂度为O(n2),空间复杂度为O(1),是一种稳定的排序算法。
所以在一组数据基本有序的情况下,用直接插入排序。
二、希尔排序
1.算法思想
希尔排序(Shell Sort)是插入排序的一种改进版本,也称为缩小增量排序。
希尔排序的基本思想是将原始数据分成若干个子序列,每个子序列的元素间隔较大,然后对每个子序列进行插入排序。随着排序的进行,逐渐减小子序列的元素间隔,直到间隔为 1,此时整个序列基本有序,再进行一次普通的插入排序即可完成排序
注意:分组时采用间隔式的排序!
希尔排序采用间隔式排序主要有以下原因:
加快元素移动速度:希尔排序将原始数据分成多个子序列,每个子序列的元素间隔较大。这样在排序过程中,元素可以以较大的步长移动,能更快地将元素移动到其最终位置附近。例如,对于一个很大的数组,如果直接进行插入排序,每个元素可能需要移动很多次才能到达最终位置。但希尔排序通过大间隔分组,让元素先进行 “远距离” 的移动,初步将数据大致排序,减少了后续插入排序时元素的移动次数。
改善最坏时间复杂度:传统的插入排序在最坏情况下(如数组完全逆序)时间复杂度为O(n2)
希尔排序通过间隔式排序,使数组在初始阶段就接近有序状态,当间隔逐渐减小时,数组已经基本有序,此时再进行插入排序,就可以避免最坏情况的发生,其平均时间复杂度介于O(n)
到O(n2)之间,通常能达到O(n1.3)左右,性能相比直接插入排序有显著提升。
利用局部有序性:在间隔式排序过程中,每个子序列内部进行排序,使得子序列逐渐变得有序。随着间隔逐渐缩小,子序列的长度逐渐增加,而之前已经排好序的子序列能为后续更大规模的排序提供一定的有序基础,充分利用了数据的局部有序性,提高排序效率。
希尔排序核心思想就是:1 间隔式分组;2 利用直接插入排序使组内有序:越有序越快;3 再缩小分组再排序,直到缩为1组。
2.代码实现
//希尔排序
//一趟希尔排序 gap为组数(间隔)
static void Shell(int* arr, int len, int gap)
{int tmp, i, j;for (i = gap; i < len; i++)//i是当前要处理的数字的下标{tmp = arr[i];//取出当前要插入的元素//遍历已排序的部分for (j = i - gap; j >= 0; j-=gap)//从i的前一个开始找位置,从后往前找,找比当前数字小的,同时移动数据{if (arr[j] > tmp){arr[j + gap] = arr[j];//将比tmp大的元素后移gap}else{break;}}arr[j + gap] = tmp;//将tmp插入正确位置}
}
void ShellSort(int* arr, int len)
{int drr[] = { 5,3,1 };//分组数,最后一个组数一定为1for (int i = 0; i < sizeof(drr) / sizeof(drr[0]); i++)//循环控制分组的次数,此处分3次(5,3,1){Shell(arr, len, drr[i]);//一趟希尔排序}
}
3.复杂度分析
希尔排序不稳定。
时间复杂度:希尔排序的时间复杂度与增量序列的选择有关。在最坏情况下,希尔排序的时间复杂度为O(n2)。在最好情况下,希尔排序的时间复杂度为O(nlogn)。
空间复杂度:希尔排序是一种原地排序算法,只需要常数级别的额外空间,因此空间复杂度为
O(1)。
稳定性:希尔排序是不稳定的排序算法。在排序过程中,相同元素的相对位置可能会发生改变。
希尔排序通过将原始数据分成多个子序列,每个子序列的元素间隔较大,使得元素可以更快地移动到其最终位置,从而提高了排序效率。它在处理大规模数据时表现较好,是一种常用的排序算法。
三、冒泡排序
1.算法思想
基本思想是:相邻两两比较,大的往后排
比较与交换:从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,就将它们交换位置。这样,每一次比较和交换都会将当前未排序部分的最大元素 “浮” 到最后面。
多次遍历:对数组进行多次遍历,每一次遍历都会将未排序部分的最大元素放到合适的位置上,直到整个数组都被排序。
2.代码实现
//冒泡排序
void Bubble(int* arr, int len)
{int tmp;for (int i = 0; i < len-1; i++)//len个数字需要len-1趟,最后一个数字默认有序{tmp = arr[i];for (int j = 0; j +1< len-i; j++)//注意越界问题;len-i提高效率{if (arr[j] > arr[j + 1]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}
3.复杂度分析
时间复杂度O(n2);空间复杂度O(1);稳定
以上是排序算法第二部分关于插入排序、希尔排序以及冒泡排序的知识,如果有帮助可以点赞收藏一下,会持续更新输出有用的内容,感兴趣可以关注我!
相关文章:
数据结构|排序算法(二)插入排序 希尔排序 冒泡排序
一、插入排序 1.算法思想 插入排序(Insertion Sort)是一种简单的排序算法,其基本思想是:将待排序的元素插入到已经有序的序列中,从而逐步构建有序序列。 具体过程如下: 把待排序的数组分为已排序和未排…...
12、主频和时钟配置实验
一、I.MX6U 时钟系统详解 1、系统时钟来源 开发板的系统时钟来源于两部分: 32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源, 24MHz 晶振是 I.MX6U 内核和其它外设的时钟源。 2、7路PLL时钟源 I.MX6U 的外设有很多,不同的外设时钟源不同, NXP 将…...
DFS和BFS的模版
dfs dfs金典例题理解就是走迷宫 P1605 迷宫 - 洛谷 dfs本质上在套一个模版: ///dfs #include<bits/stdc.h> using namespace std; int a[10][10]{0}; int m,n,t,ans0; int ex,ey; int v[10][10]{0}; int dx[4]{-1,0,1,0}; int dy[4]{0,1,0,-1}; void dfs(in…...
docker镜像导出导入
在Docker中,可以很容易地导出和导入镜像,这对于备份、迁移或者在不同的环境中共享镜像非常有用。以下是操作步骤: 导出镜像 使用 docker save docker save 命令可以用来将一个或多个镜像保存到一个文件中,这个文件可以被导入到任…...
大模型Agent | 构建智能体 AI-Agent的 5大挑战,及解决方案!
源自: AINLPer(每日干货分享!!) 编辑: ShuYini 校稿: ShuYini 时间: 2025-4-7 更多:>>>>专注大模型/AIGC、学术前沿的知识分享! 引言 AI-Agent正变得越来越智能,它能够根据用户需…...
基于STM32、HAL库的IP2721 快充协议芯片简介及驱动程序设计
一、简介: IP2721是一款高性能的USB PD (Power Delivery)协议控制器芯片,主要用于USB Type-C接口的电源管理。它支持USB PD 3.0规范,能够实现多种电压和电流的协商,广泛应用于充电器、移动电源等设备。 主要特性: 支持USB PD 3.0规范 支持Type-C接口的DRP/SRC/SNK模式 内…...
荣耀90 GT信息
外观设计 屏幕:采用 6.7 英寸 AMOLED 荣耀绿洲护眼屏,超窄边框设计,其上边框 1.6mm,左右黑边 1.25mm,屏占较高,带来更广阔的视觉体验。屏幕还支持 120Hz 自由刷新率,可根据使用场景自动切换刷新…...
53. 评论日记
要自己有判断是非的能力宝子们。#小米 #小米su7 #雷军 #神操作 #小米su7ultra_哔哩哔哩_bilibili 2025年4月8日19:30:57...
【10】搭建k8s集群系列(二进制部署)之安装Dashboard和CoreDNS
一、部署Dashboard 1.1、创建kubernetes-dashboard.yaml文件 完整的yaml配置文件信息如下: # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in …...
【算法手记12】DP25 删除相邻数字的最大分数
🦄个人主页:修修修也 🎏所属专栏:刷题 ⚙️操作环境:牛客网 目录 一.DP25 删除相邻数字的最大分数 题目详情: 题目思路: 解题代码: 结语 一.DP25 删除相邻数字的最大分数 牛客网题目链接(点击即可跳转):DP25 删除相邻数字的最大分数 题目详情: 本题详情如…...
[Godot] C#简单实现人物的控制和动画
目录 实现效果 场景搭建 脚本实现 移动 动画 完整脚本 相机跟随 总结 实现效果 场景搭建 本文章只分享了关于移动和动画的,没有给碰撞体,大家根据需要自行添加吧 相机的缩放大小可以根据自己的需要调整 我的人物动画结构是这样的,待机动…...
选择站群服务器租用的优势都有什么?
站群服务器是一种专门用于托管多个网站的服务器,是通过集中管理和资源分配,可以支持同时运行数十个甚至是数百个独立网站,站群服务器的主要特点就是让每个网站可以分配独立的IP地址,避免出现IP关联风险,通过统一控制面…...
VS Code下开发FPGA——FPGA开发体验提升__下
上一篇:IntelliJ IDEA下开发FPGA-CSDN博客 Type:Quartus 一、安装插件 在应用商店先安装Digtal IDE插件 安装后,把其他相关的Verilog插件禁用,避免可能的冲突。重启后,可能会弹出下面提示 这是插件默认要求的工具链&a…...
leetcode13.罗马数字转整数
遍历,下一个值不大于当前值就加上当前值,否则就减去当前值 class Solution {public int romanToInt(String s) {Map<Character, Integer> map Map.of(I, 1,V, 5,X, 10,L, 50,C, 100,D, 500,M, 1000);int sum 0;for (int i 0; i < s.length(…...
WVP-PRO配置与部署
ZLMediaKit部署与配置 https://blog.csdn.net/qq_38179971/article/details/147043763MySQL8.0.13安装[Ubuntu16.04] cd /usr/local/src wget http://soft.vpser.net/lnmp/lnmp1.6.tar.gz -cO lnmp1.6.tar.gz && tar zxf lnmp1.6.tar.gz && cd lnmp1.6 &…...
opencv图像库编程
目录 一、Linux搭建C OpenCV开发环境1.安装必要依赖项2.安装opencv3、cmake分析4、验证安装 二、编写一个打开图片进行特效显示的代码 test.cpp1.gcc方式编译1)在opencv3.4.5下新建mytest文件夹2)创建test.cpp3)编译 2.makemakefile方式编译3…...
【Easylive】定时任务-每日数据统计和临时文件清理
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 这个定时任务系统主要包含两个核心功能:每日数据统计和临时文件清理。下面我将详细解析这两个定时任务的实现逻辑和技术要点: Component Slf4j public class SysTas…...
搜广推校招面经七十
美团暑期推荐实习 一、讲一下self-attention,qkv的含义。 见【搜广推校招面经五】 二、讲一下协同过滤召回,新闻推荐项目为什么不用usercf? 见【搜广推校招号面经六十四】 三、介绍信息增益公式(Information Gain) 见【搜广…...
TypeScript 泛型详解及应用场景
泛型(Generics)是 TypeScript 的核心特性,它允许我们编写可复用、类型安全的代码,同时保持灵活性。以下是深度解析和实际应用指南: 一、泛型基础概念 本质:参数化类型,将类型作为变量传递&…...
Proximal Policy Optimization (PPO)2017
2.1 策略梯度方法 策略梯度方法计算策略梯度的估计值并将其插入到随机梯度上升算法中。最常用的梯度估计器的形式如下: g ^ E t [ ∇ θ log π θ ( a t ∣ s t ) A ^ t ] (1) \hat{g} \mathbb{E}_t \left[ \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) \h…...
使用 Google ML Kit 实现图片文字识别(提取美国驾照信息)
Google ML Kit 是一个现代、功能强大、跨平台的机器学习 SDK。在这篇文章中,我们将使用 ML Kit 在 Android 应用中识别图片文字,以提取美国驾照上的关键信息:DL(驾照号) 和 EXP(有效日期)。 &am…...
VR体验馆如何用小程序高效引流?3步打造线上预约+团购裂变系统
VR体验馆如何用小程序高效引流?3步打造线上预约团购裂变系统 一、线上预约的核心价值:优化体验,提升转化 减少客户等待时间 通过小程序预约功能,客户可提前选择体验时段,避免到店排队。数据显示&#…...
前端知识(vue3)
1.Vue3 1.1 介绍 Vue(读音 /vjuː/, 类似于 view)是一款用于构建用户界面的渐进式的JavaScript框架 官网:https://cn.vuejs.org 1.2 常见指令 指令:指的是HTML 标签上带有 v- 前缀的特殊属性,不同指令具有不同含义…...
nginx 代理 https 接口
代码中需要真实访问的接口是:https://sdk2.028lk.com/application-localizationdev.yml文件中配置: url: http:/111.34.80.138:18100/sdk2.028lk.com/该服务器111.34.80.138上 18100端口监听,配置信息为: location /sdk2.028lk.c…...
网络带宽测速工具选择指南iperf3 nttcp tcpburn jperf使用详解
简介 本文主要介绍内网(局域网)与外网(互联网)的网络带宽测速工具下载地址、选择指南、参数对比、基本使用。 测速工具快速选择指南 测速工具下载地址 iperf 官网下载链接:iperf.fr/iperf-download.php该链接提供了不…...
解决TF-IDF增量学习问题的思路与方案
TF-IDF的传统实现面临增量学习困难,因为IDF计算依赖全局文档统计信息。但是实际的工作当中往往数据是增量的,并且定期增量和不定期增量混合,所以为了实际考虑,还是有必要思考如何解决TF-IDF增量问题的。 一、增量学习核心挑战 ID…...
【亲测】Linux 使用 Matplotlib 显示中文
文章目录 安装中文字体在Matplotlib中使用该字体来显示中文 在 Linux 系统中使用 Matplotlib 绘制图表时,如果需要显示中文,可能会遇到中文字符显示为方块或者乱码的问题。这是因为Matplotlib 默认使用的字体不支持中文。本文手把手带你解决这个问题。 …...
git clone阻塞问题
问题描述 git clone采用的ssh协议,在克隆仓库的时候,会经常卡一下,亦或是直接卡死不动。 最开始以为是公司电脑配置的问题,想着自己实在解决不了找it帮忙。 查阅资料发现,最终发现是git版本的问题,这个是…...
Json快速入门
引言 Jsoncpp 库主要是用于实现 Json 格式数据的序列化和反序列化,它实现了将多个数据对象组织成 为Json格式字符串,以及将 Json 格式字符串解析得到多个数据对象的功能,独立于开发语言。 Json数据对象 Json数据对象类的表示: …...
【QT】学习笔记1
QT概述 Qt是一个1991年由QtCompany开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(…...
【Kafka基础】生产者命令行操作指南:从基础到高级配置
Kafka作为分布式消息系统,其生产者是数据管道的起点。掌握kafka-console-producer.sh工具的使用对于开发测试和运维都至关重要。本文将系统介绍该工具的各种用法,帮助您高效地向Kafka发送消息。 1 基础消息生产 1.1 最简单的消息发送 /export/home/kafk…...
【Java面试系列】Spring Boot中自动配置原理与自定义Starter开发实践详解 - 3-5年Java开发必备知识
【Java面试系列】Spring Boot中自动配置原理与自定义Starter开发实践详解 - 3-5年Java开发必备知识 引言 Spring Boot作为Java生态中最流行的框架之一,其自动配置机制和Starter开发是面试中的高频考点。对于3-5年经验的Java开发者来说,深入理解这些原理…...
reid查找余弦相似度计算修正(二)
上一篇文章 reid查找余弦相似度计算(一) 上一篇的遗留问题就是reid 的结果部分正确,我们参考一下 fast-reid的demo,把里面的抽取特征提取出来 修改提取特征 首先发现图像改变大小的不同,fast 使用的是[128,384], 如…...
嵌入式---加速度计
一、基本概念与定义 定义 加速度计(Accelerometer)是一种测量物体加速度(线性加速度或振动加速度)的传感器,可检测物体运动状态、振动幅度、倾斜角度等,输出与加速度成比例的电信号(模拟或数字信…...
Redis如何判断哨兵模式下节点之间数据是否一致
在哨兵模式下判断两个Redis节点的数据一致性,可以通过以下几种方法实现: 一、检查主从复制偏移量 使用INFO replication命令 分别在主节点和从节点执行该命令,比较两者的master_repl_offset(主节点)和slave_repl_offs…...
Spring 核心注解深度解析:@Autowired、@Repository 与它们的协作关系
引言 在 Spring 框架中,依赖注入(DI) 是实现松耦合架构的核心机制。Autowired 和 Repository 作为两个高频使用的注解,分别承担着 依赖装配 和 数据访问层标识 的关键职责。本文将深入探讨它们的功能特性、协作模式…...
LeetCode541反转字符串②
思路: 关键是判断反转的右边界, ①当剩余字符数<k,是反转当前所有字符,右边界就是rightlen-1,不可以超过len-1,会越界; ②当剩余字符数>k且<2k,反转k个字符,右边界就是righ…...
Ubuntu 22 Linux上部署DeepSeek+RAG知识库操作详解(Dify方式)之2
上一篇在ubuntu上通过docker拉取了dify并启动与它相关的服务,本篇主要介绍两个知识点: 一是配置模型,使用之前通过Xinference搭建的本地deepseek模型,启动过程参考前期文档,这里就不做介绍了。(注意一点&a…...
如何在多线程中安全地使用 PyAudio
1. 背景介绍 在多线程环境下使用 PyAudio 可能会导致段错误(Segmentation Fault)或其他不可预期的行为。这是因为 PyAudio 在多线程环境下可能会出现资源冲突或线程安全问题。 PyAudio 是一个用于音频输入输出的 Python 库,它依赖于 PortAu…...
Spring MVC与Spring Boot文件上传配置项对比
Spring MVC与Spring Boot文件上传配置项对比 一、Spring MVC配置项(基于不同MultipartResolver实现) 1. 使用 CommonsMultipartResolver(Apache Commons FileUpload) Bean public MultipartResolver multipartResolver() {Common…...
多类型医疗自助终端智能化升级路径(代码版.上)
大型医疗自助终端的智能化升级是医疗信息化发展的重要方向,其思维链一体化路径需要围绕技术架构、数据流协同、算法优化和用户体验展开: 一、技术架构层:分布式边缘计算与云端协同 以下针对技术架构层的分布式边缘计算与云端协同模块,提供具体编程实现方案: 一、边缘节点…...
Chrome 浏览器插件收录
1. Responsive Viewer 可以在同个窗口内,针对同一网站,添加多个不同设备屏幕显示。 在前端开发,需要多端适配,尤其是移动端响应式适配的网站开发中,可以同时测试多个不同屏幕的适配效果。 2. VisBug 提供工具栏&#x…...
力扣hot100_回溯(2)_python版本
一、39. 组合总和(中等) 代码: class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一个合法组合ans.append(pa…...
文档大模型
处理流程: 对表格或者文章文档切分成chunk,将其存入DB根据chunk文档内容,通过prompt生成问题(qwen)通过sentencetransformer生成embbedding(Text embedding 模型 stella_large 模型,长文本编码), 第二步 抽…...
基于分布式指纹引擎的矩阵运营技术实践:突破平台风控的工程化解决方案
一、矩阵运营的技术痛点与市场现状 风控机制升级 主流平台通过复合指纹识别(Canvas渲染哈希WebGL元数据AudioContext频率分析)检测多账号关联传统方案成本:单个亚马逊店铺因关联封号月均损失$5000,矩阵规模越大风险指数级增长 …...
SpringBoot 统一功能处理
1.拦截器 1.1什么是拦截器 拦截器是Spring框架提供的核心功能之一,主要是用来拦截用户的请求,在用户请求指定的方法执行前后,可以根据业务需要执行实现预定的代码。 通过拦截器,开发人员就可以根据需求针对一些特殊的请求&#…...
Redis到底能不能做主数据库?
张三拍案而起:“Redis 是缓存数据库,怎么能当主数据库用?简直是天方夜谭!” 李四冷笑回应:“你没用过,凭什么说不行?我已经用 Redis 做主数据库好几年了,系统稳定得像铁板一块&…...
C++ 基础进阶
C 基础进阶 内容概述: 函数重载:int add(int x, inty);,long long add(long long x, long long y);,double add(double x, double y);模板函数:template<typename T> 或 template<class T>结构体&#x…...
从C语言到Go语言:新手快速入门指南
对于刚学会C语言的新手来说,学习Go语言(Golang)可能是一个既有趣又有挑战性的过程。Go语言由Google开发,以简洁、高效和并发支持著称,被广泛用于现代软件开发。相比C语言,Go语言在语法上更加现代化…...
Vue.js 中 v-model 的使用及其原理
在 Vue.js 开发中,v-model是一个非常重要且常用的指令。它极大地简化了表单元素与数据之间的双向绑定操作,让开发者能够更高效地处理用户输入和数据更新。接下来,我们将深入探讨v-model的使用场景及其背后的工作原理。 一、v-model 的基本…...