数据结构(排序(上)):冒泡、选择、插入

数据结构(排序(上)):冒泡、选择、插入排序

[作者的个人gitee▶️](友人A (friend-a188881041351) - Gitee.com)

每日一言:“人生是一场盛大的修行,我们在时光的长河中,不断与自己和解,与世界对话。🌸🌸每一次挫折都是灵魂的磨砺,每一次成长都是生命的馈赠😊”


一.冒泡排序

1.基本概念:

冒泡排序是一种简单的排序算法。它重复地遍历要排序的序列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历序列的工作是重复地进行,直到没有再需要交换,也就是说该序列已经排序完成。

这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。

2.工作原理

  1. 外层循环
    • 外层循环控制排序的轮数。对于一个包含 n 个元素的数组,需要进行 n - 1 轮比较。例如,对于数组 [5, 3, 8, 6, 2],有 5 个元素,所以需要进行 4 轮比较。
  2. 内层循环
    • 内层循环负责每一轮中的比较和交换操作。在第 i 轮比较中,内层循环会比较相邻的元素,从数组的第 1 个元素开始,比较第 i 个元素和第 i + 1 个元素。如果第 i 个元素大于第 i + 1 个元素(对于升序排序),就交换它们的位置。
    • 随着排序的进行,每一轮比较的次数会逐渐减少。在第 i 轮比较时,只需要比较 n - i 次。因为经过前 i - 1 轮排序后,数组的最后 i - 1 个元素已经是排好序的了,不需要再比较。

3.代码示例

void BubbleSort(vector<int>& arr)
{//外层循环每循环一次就使一个数去到正确的位置for (int i = 0; i < arr.size(); i++){for (int j = 0; j < arr.size() - 1 - i; j++){if (arr[j] > arr[j+1])swap(arr[j], arr[j+1]);}}
}

二.选择排序

1.基本概念

选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是:在每一轮排序中,从未排序的部分选择一个最小(或最大)的元素,将其放到已排序部分的末尾。通过不断选择最小(或最大)的元素,逐步构建有序序列。

2.工作原理

  1. 初始状态
    • 假设有一个数组,初始时整个数组都是未排序的。例如,对于数组 [64, 25, 12, 22, 11],所有元素都未排序。
  2. 选择最小元素
    • 在第一轮排序中,从整个数组中找到最小的元素(这里是 11),将其与数组的第一个元素(64)交换位置。此时,数组的第一个位置已经排好序,数组变为 [11, 25, 12, 22, 64]。
  3. 缩小未排序范围
    • 在第二轮排序中,从剩下的未排序部分(从第二个元素开始,即 [25, 12, 22, 64])中找到最小的元素(这里是 12),将其与未排序部分的第一个元素(25)交换位置。此时,数组变为 [11, 12, 25, 22, 64]。
  4. 重复操作
    • 每一轮都在缩小的未排序部分中选择最小的元素,将其放到已排序部分的末尾。重复这个过程,直到整个数组排序完成。

3.代码示例

void SelectSort(vector<int>& arr)
{if (arr.size() <= 1)return;for (int i = 0; i < arr.size(); i++){int minIndex = i;//假设最小数位置是ifor (int j = i + 1; j < arr.size(); j++)//j是i+1的位置,遍历i+1~n-1位置{if (arr[j] < arr[minIndex])//如果j位置的数比i小,则更新minIndex,使它指向最小元素minIndex = j;//每次内层循环结束后,minIndex的值已经是i+1~n-1区间内最小值的索引}//交换arr[i]与arr[minIndex]即可,此刻就保证了i位置的值是最小值swap(arr[i],arr[minIndex]);}
}

三.插入排序

1.基本概念

插入排序(Insertion Sort)是一种简单直观的排序算法。它的基本思想是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。类似于整理扑克牌的过程,每次从牌堆中抽出一张牌,插入到已经排好序的牌中合适的位置。

2.工作原理

  1. 初始状态
    • 假设有一个数组,初始时第一个元素被视为已排序部分,其余元素为未排序部分。例如,对于数组 [5, 2, 4, 6, 1, 3],初始时 5 是已排序部分,其余是未排序部分。
  2. 插入操作
    • 从未排序部分取出第一个元素(这里是 2),将其插入到已排序部分的合适位置。已排序部分只有一个元素 5,2 比 5 小,所以 2 插入到 5 的前面,数组变为 [2, 5, 4, 6, 1, 3]。
  3. 重复操作
    • 继续从未排序部分取出下一个元素(这里是 4),将其插入到已排序部分的合适位置。已排序部分是 [2, 5],4 插入到 2 和 5 之间,数组变为 [2, 4, 5, 6, 1, 3]。
    • 重复这个过程,直到未排序部分为空,整个数组排序完成。

3.代码示例

void InsertSort_2(vector<int>& arr)
{if (arr.size() == 0 || arr.size() == 1)return;for (int i = 0; i < arr.size(); i++){int end = i;//指向有序序列最后一个位置int tmp = arr[end + 1];//保存要插入的元素while (end >= 0)//一次内层循环使待插入元素依次与已排序元素比较{//如果待插入元素小于end指向的元素,就先让tmp保存待排序元素//之后将end指向的元素向后挪动覆盖//之后end--,tmp再与end指向元素比较,直到end减为-1或符合else条件,循环结束if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}elsebreak;}arr[end + 1] = tmp;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL:语言基础与数据库操作

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

KMP算法

KMP算法 为什么叫做KMP呢。 因为是由这三位学者发明的&#xff1a;Knuth&#xff0c;Morris和Pratt&#xff0c;所以取了三位学者名字的首字母。所以叫做KMP next数组就是一个前缀表&#xff08;prefix table&#xff09;。 前缀表是用来回退的&#xff0c;它记录了模式串与…

3D点云数据处理中的聚类算法总结

1.欧式聚类&#xff1a; 基于点的空间距离&#xff08;欧几里得距离&#xff09;来分割点云&#xff0c;将距离较近的点归为同一簇。 欧式聚类需要的参数&#xff1a;邻域半径R,簇的最小点阈值minPts&#xff0c;最大点数阈值maxPts。 实现效率&#xff1a; O(n * log n) 实现…

WRC世界机器人大会-2024年展商汇总

2024世界机器人大会 时间&#xff1a;2024年8月21日至25日 地点&#xff1a;北京经济技术开发区北人亦创国际会展中心 大会主题&#xff1a;共育新质生产力&#xff0c;共享智能新未来 2024世界机器人博览会亮点纷呈&#xff0c;20余款人形机器人整机将亮相博览会&#xff…

拉取镜像,推送到阿里云镜像仓库

需求背景&#xff1a;在学习k8s&#xff0c;虚拟机无法正常拉取 wangyanglinux/tools:busybox 镜像。 解决办法&#xff1a;将墙外镜像拉到国内&#xff08;阿里云&#xff09;再使用 准备工作需要创建对应的镜像仓库&#xff0c;然后再进行推送 1. 拉取镜像 docker pull …

DeepSeek和Kimi在Neo4j中的表现

以下是2个最近爆火的人工智能工具&#xff0c; DeepSeek:DeepSeek Kimi: Kimi - 会推理解析&#xff0c;能深度思考的AI助手 1、提示词&#xff1a; 你能帮我生成一个知识图谱吗&#xff0c;等一下我会给你一篇文章&#xff0c;帮我从内容中提取关键要素&#xff0c;然后以N…

哈尔滨工业大学DeepSeek公开课人工智能:大模型原理 技术与应用-从GPT到DeepSeek|附视频下载方法

导 读INTRODUCTION 今天继续哈尔滨工业大学车万翔教授带来了一场主题为“DeepSeek 技术前沿与应用”的报告。 本报告深入探讨了大语言模型在自然语言处理&#xff08;NLP&#xff09;领域的核心地位及其发展历程&#xff0c;从基础概念出发&#xff0c;延伸至语言模型在机器翻…

redis解决缓存穿透/击穿/雪崩

文章目录 1.缓存穿透1.1 概念1.2 解决方案1.2.1 缓存空对象1.2.2 布隆过滤 1.2 店铺查询使用缓存穿透解决方案1.2.1 流程 2.缓存雪崩2.1 什么是缓存雪崩&#xff1f;2.2 雪崩解决方案 3.缓存击穿3.1 什么是缓存击穿&#xff1f;3.2解决方案3.2.1 基于互斥锁解决缓存击穿问题&am…

不连续平面提取

不连续平面提取 提取流程 #mermaid-svg-Y87uP8WsVRmPYriG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Y87uP8WsVRmPYriG .error-icon{fill:#552222;}#mermaid-svg-Y87uP8WsVRmPYriG .error-text{fill:#552222;s…

大语言模型-2.2/3-主流模型架构与新型架构

简介 本博客内容是《大语言模型》一书的读书笔记&#xff0c;该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的…

数据库操作练习

一.向heros表中新增一列信息&#xff0c;添加一些约束&#xff0c;并尝试查询一些信息 //向表中添加一列age信息 alter table heros add column age int;//id列添加主键约束&#xff0c;设置自增 alter table heros modify column id int auto_increment primary key;//name列…

CTF【WEB】学习笔记1号刊

Kali的小工具箱 curl www.xxx.com&#xff1a;查看服务器响应返回的信息 curl -I www.xxx.com:查看响应的文件头 一、cmd执行命令 ipconfig&#xff1a;ip地址配置等&#xff1b; 二、 Kali操作 1.sudo su&#xff1b; 2.msfconsole 3.search ms17_010 永恒之蓝&#xff…

在 SaaS 应用上构建 BI 能力的实战之路

SaaS 产品在持续运营过程中积累了大量数据&#xff0c;这些数据不仅是数字的记录&#xff0c;更是洞察市场趋势、优化产品功能、提升用户体验的宝贵资源。 因此&#xff0c;大部分的 SaaS 产品在发展到一定阶段后&#xff0c;都会开始构建自己的报表模块或分析模块&#xff0c;…

gonet开源游戏服务器环境配置

1.mysql搭建 搜索mysql-server apt安装包名 sudo apt search mysql-server 安装mysql-server sudo apt-get install mysql-server 安装完成后会&#xff0c;启动mysql服务及创建系统服务 查看服务状态 systemctl status mysql.service 使用超级权限登陆mysql sudo mysql 授…

STM32基础篇(五)------TIM定时器比较输出

简介 定时器的类型 在《STM32F10xxx参考手册&#xff08;中文&#xff09;.pdf》中可以看到下面三个章节 因此可以得到 高级定时器含有通用定时器的所有功能&#xff0c;通用定时器含有基本定时器的所有功能&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;…

基于STM32的两路电压测量仿真设计Proteus仿真+程序设计+设计报告+讲解视频

基于STM32两路电压测量仿真设计(Proteus仿真程序设计设计报告讲解视频&#xff09; 仿真图Proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0106 1.主要功能 基于STM32单片机设计一个双路电压检测器 1.系统可以测量两路输入电…

210、【图论】课程表(Python)

题目 思路 这道题本质上是一个拓扑排序。每次先统计每个点的入度个数、然后再统计点与点之间的邻接关系&#xff0c;找到入度为0的点作为起始遍历点。之后每遍历到这个点之后&#xff0c;就把这个点后续的邻接关系边的点入度减去一。当某个点入度为0时&#xff0c;继续被加入其…

react 杂记2 优化hook

useEffect 每个Fiber节点都会为该组件的所有effec对象​维护一个链表, 场景​类组件方法函数组件等效写法差异说明挂载时执行componentDidMount()useEffect(fn, [])useEffect 副作用在浏览器绘制后异步执行&#xff1b;componentDidMount 是同步的。更新时执行componentDidUp…

Java内存泄漏、CPU飙升排查

在Java应用开发中&#xff0c;内存泄漏和CPU飙升是两类高频出现的生产问题&#xff0c;也是常见的面试问题。这里通过一些demo进行实践。 内存泄漏 private static List<byte[]> leakList new ArrayList<>();GetMapping("/memory/leak") public void …

【搜索】dfs(回溯、剪枝、记忆化)

个人主页&#xff1a;Guiat 归属专栏&#xff1a;我讲你听 文章目录 1. dfs 回溯1.1 回溯介绍1.2 回溯模板1.3 回溯经典题目 2. dfs 剪枝2.1 剪枝介绍2. 2 剪枝模板2.3 经典题目 3. dfs 记忆化3.1 记忆化介绍3.2 记忆化示例 正文 1. dfs 回溯 1.1 回溯介绍 核心思想&#xff…