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

数据结构——排序(2):选择排序+交换排序

目录

一、选择排序

(1)直接选择排序

①思路

②过程图示

③代码实现

④代码解释

⑤优化

1.代码实现

2.过程图示

3.代码解释

4.注意

⑥直接选择排序的复杂度

(2)堆排序

①注意

②代码实现

二、交换排序

(1)冒泡排序

①思路

②过程图示

③代码实现

④代码解释

⑤复杂度

(2)快速排序

①思路

②主要框架

三、写在最后


一、选择排序

思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据排完。

(1)直接选择排序

①思路

首先在元素集合中(i ~ n-1)选择出最大(或最小)的数据元素。若它不是这组元素中的最后一个(或第一个)元素,则将它与最后一个(或第一个)元素交换。然后在剩余的集合中(i ~ n-2 或 i+1 ~ n-1)重复上述步骤,直到集合中只剩下1个元素。

②过程图示

我们以数组{2,3,9,6,5}为例:

③代码实现

void SelectSort(int* arr, int n)
{for(int i = 0 ; i < n; i ++){//先假设第一个元素为最小int min = i;//找最小值for(int j = i ; j < n; j ++){if(arr[j] < arr[min]){min = j;}}}//将最小值与无序区间的第一个元素交换swap(&arr[i],&arr[min]);
}

④代码解释

第一个for循环用来遍历数组所有数据,第二个for循环用来遍历后面的无序区间,找出最小值后将其放在无序区间的第一个位置。然后缩小无序区间之后重复循环。

⑤优化

上述代码的实现相当于将每一个数据都与其后面的数据进行比较,是不是觉得复杂度不是很理想呢?如果能够同时将最大值和最小值都找到并分别放在该区间的第一个和最后一个位置,效率一定会变高!

1.代码实现
void SelectSort(int* arr, int n)
{int begin = 0;int end = n - 1;while(begin < end){int min = begin;int max = begin;for(int i = begin + 1; i <= end; i++){if(arr[i] < arr[min]){min = i;}if(arr[i] > arr[max]){max = i;}}//避免max和begin在同一个位置,begin和min交换之后,max变成了最小的数据if(max == begin){max = min;}//将begin和min的位置交换//将end和max的位置交换swap(&arr[begin], &arr[min]);swap(&arr[end], &arr[max]);begin++;end--;}
}
2.过程图示

我们以数组{5,3,9,6,2}为例:

3.代码解释

定义begin、end来确定无序区间的界限,在区间合法的情况下找到最小值和最大值,并分别将最小值和最大值与begin和end位置的数据进行交换。

4.注意

不能忽略max和begin在同一位置的情况,否则会出错!

下面我们以数组{9,3,1}为例:

首先请看错误情况:

 最小值和最大值与begin和end位置的数据进行交换之后,end位置不是最大值的数据!这时,min和begin交换之后,max却成了最小值,这不符合我们之前的思路。

那么当max和begin在同一个位置时,我们应该让max的值等于min,这样交换之后end位置为最大值。

⑥直接选择排序的复杂度

直接选择排序的思路好理解,但是效率不是太高:时间复杂度:O(N^2),空间复杂度:O(1)。

(2)堆排序

堆排序是利用堆积树这种数据结构所涉设计的一种排序算法,是选择排序的一种。

①注意

排升序建大堆,排降序建小堆。

②代码实现

我们在二叉树章节已经讲解,在此不再赘述,代码如下:

void HeapSort(int* a, int n)
{// a数组直接建堆 O(N)for (int i = (n-1-1)/2; i >= 0; --i){AdjustDown(a, n, i);}// O(N*logN)int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);--end;}
}

二、交换排序

思想:将序列中两个数据通过比较结果来对换位置。

特点:将数值大的元素向序列尾部移动,将数值小的元素向序列前部移动。

(1)冒泡排序

在C语言的学习过程中,我们已经接触了冒泡排序。之所以叫做冒泡排序,是因为每一个元素可以像一个小气泡一样,根据自身大小一点一点向数组一侧移动。

①思路

通过for循环遍历数组中的数据,将最大值放在最后面,完成排序。

②过程图示

③代码实现

void BubbleSort(int* arr, int n)
{int flag = 0;for(int i = 0; i < n; i ++){for(int j = 0; j < n - 1 - i; j ++){if(arr[j] > arr[j + 1]){flag = 1;swap(&arr[j], &arr[j + 1]);}}if(flag == 0){break;}}
}

④代码解释

外层for循环用来遍历数组的数据,内层循环用来比较相邻的数据的大小,将小数据放在大数据前面。内层循环每进行一次,将最大值放在j范围的最后。最终将每次范围内的最大值放在最后,完成排序。

⑤复杂度

冒泡排序的时间复杂度:O(N^2),空间复杂度:O(1)。

(2)快速排序

①思路

任取待排序元素序列中的某元素作为基准值,按照该基准值将序列分割为两子序列,其中左序列中的元素均小于基准值,右序列中的元素均大于基准值,然后再将左右序列重复该过程,直到所有元素排序完成。

②主要框架

void QuickSort(int* arr, int left, int right)
{if(left >= right){return;}int key = _QuickSort(arr, left, right);QuickSort(arr, left, key -1);QuickSort(arr, key + 1, right);
}

首先得到基准值key,然后分别将左右子树进行相同的操作,直至left >= right。(递归) 

三、写在最后

在快速排序中,找基准数的函数有多种实现方法,我们下期见~

敬请期待“数据结构——排序(3)”~

相关文章:

数据结构——排序(2):选择排序+交换排序

目录 一、选择排序 &#xff08;1&#xff09;直接选择排序 ①思路 ②过程图示 ③代码实现 ④代码解释 ⑤优化 1.代码实现 2.过程图示 3.代码解释 4.注意 ⑥直接选择排序的复杂度 &#xff08;2&#xff09;堆排序 ①注意 ②代码实现 二、交换排序 &#xff08…...

jenkins升级踩坑记录

1. 直接用java 1.8版本启动最新版jenkins.war&#xff0c;直接失败 2. 下载java 11启动&#xff0c;依然失败&#xff0c;换成java17版本可以启动&#xff0c;但会报错 解决报错1&#xff1a; java.io.IOException: Failed to load: Parameterized Remote Trigger Plugin (Pa…...

mysql笔记第二篇

平时业务开发&#xff0c;大部分业务逻辑是使用sql还是代码编写呢&#xff1f; 这个每个公司可能要求不同&#xff0c;其实是每个公司负责人根据公司业务制定的规定。或者根本没有规定&#xff0c;每个负责单个项目的人领到需求直接开整&#xff0c;sql一把梭导致后面其他人维护…...

Facebook的区块链技术:提升数据安全与隐私保护

去中心化的优势 随着数字化时代的快速发展&#xff0c;数据安全和隐私保护已成为全球范围内备受关注的话题。Facebook作为全球最大的社交平台之一&#xff0c;正在积极探索如何通过区块链技术来提升数据的安全性和用户的隐私保护。区块链技术以其去中心化、不可篡改和透明的特…...

⌈ 传知代码 ⌋ Visual SLAM函数

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…...

Vue组件之间的通信

一、通信方式 Props 和 Events&#xff1a;通过父组件传递 props 给子组件&#xff0c;子组件使用 $emit 发送事件到父组件。Event Bus&#xff1a;使用一个中央事件总线来跨组件通信。Vuex&#xff1a;使用 Vuex 进行全局状态管理&#xff0c;以便在任何组件间共享状态。Prov…...

【AI 绘画】模型转换与快速生图(基于diffusers)

AI 绘画- 模型转换与快速生图&#xff08;基于diffusers&#xff09; 1. 本章介绍 本次主要展示一下不同框架内文生图模型转换&#xff0c;以及快速生成图片的方法。 SDXL文生图 2. sdxl_lightning基本原理 模型基本原理介绍如下 利用蒸馏方法获取小参数模型。首先&#x…...

甄选范文“论软件设计方法及其应”软考高级论文系统架构设计师论文

论文真题 软件设计(Software Design,SD)根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…...

leetcode线段树(2940. 找到 Alice 和 Bob 可以相遇的建筑)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 描述 给你一个下标从 0 开始的正整数数组 heights &#xff0c;其中 heights[i] 表示第 i 栋建筑的高度。 如果一个人在建筑 i &#xff0c;且存在 i < j 的建筑…...

用于不平衡医疗数据分类的主动SMOTE

一、主动学习如何应用于不平衡数据的处理 首先&#xff0c;主动SMOTE不是像经典的SMOTE那样从训练集中随机选择一个样本作为生成合成样本的轴心点&#xff0c;而是通过不确定性和多样性采样来智能地进行样本选择&#xff0c;这是主动学习的两种技术。 在数据不平衡的情况下&…...

linux文件更新日期与系统日期比较

项目说明&#xff1a; 要获取linux系统中某目录下最新文件的修改时间并与当前系统时间进行比较&#xff0c;可以使用以下步骤&#xff1a; 使用 ls 命令获取最新文件的修改时间。 使用 date 命令获取当前时间。 计算时间差并打印结果。 实例脚本如下&#xff1a; #!/bin/…...

leetCode - - - 哈希表

目录 1.模拟行走机器人&#xff08;LeetCode 874&#xff09; 2.数组的度&#xff08;LeetCode 697&#xff09; 3.子域名访问次数&#xff08;LeetCode 811&#xff09; 4.字母异位词分组&#xff08;LeetCode 49&#xff09; 5.小结 1.常见的哈希表实现 2.遍历Map 1.模…...

NGINX自动清理180天之前的日志

需求描述 日志每天会以天为单位产生一个日志&#xff0c;不清理的话会越来越多。这里写一个Lua自定定时清理日志目录下的日志文件。 依赖安装 安装 lfs 模块 yum install luarocks yum install lua-develluarocks install luafilesystem 创建模拟旧文件 创建了一个1月的旧…...

jackson 轻松搞定接口数据脱敏

一、简介 实际的业务开发过程中&#xff0c;我们经常需要对用户的隐私数据进行脱敏处理&#xff0c;所谓脱敏处理其实就是将数据进行混淆隐藏&#xff0c;例如下图&#xff0c;将用户的手机号、地址等数据信息&#xff0c;采用*进行隐藏&#xff0c;以免泄露个人隐私信息。 如…...

Nginx 正则表达式与rewrite

目录 一、正则表达式 二、rewrite 2.1 rewrite简述 2.2 rewrite 跳转 2.3 rewrite 执行顺序 2.4 rewrite 语法格式 三、location 3.1 location 类别 3.2 location常用匹配规则 3.3 location优先级 3.4 示例说明 3.5 匹配规则总结 3.6 三个匹配规则定义 四、实战…...

tekton什么情况下在Dockerfile中需要用copy

kaniko配置如下 如果docker中的workDir跟tekton中的workDir不一致需要copy。也可以通过mv&#xff0c;cp达到类似效果...

第九届世界渲染大赛在哪里提交作品呢?

自第九届世界渲染大赛开放投稿以来&#xff0c;已经过去了10天。在这段时间里&#xff0c;众多CG爱好者已经完成了他们的动画创作。然而&#xff0c;许多参赛者对于如何提交他们的作品仍然感到困惑。接下来&#xff0c;让我们一起了解具体的投稿流程和入口&#xff0c;确保每位…...

fastjson(autoType)反序列化漏洞

1. 温少和他的fastjson 阿里巴巴的 FastJSON&#xff0c;也被称为 Alibaba FastJSON 或阿里巴巴 JSON&#xff0c;是一个高性能的 Java JSON 处理库&#xff0c;用于在 Java 应用程序中解析和生成 JSON 数据。FastJSON 以其卓越的性能和功能丰富的特点而闻名&#xff0c;并在…...

Java入门基础16:集合框架1(Collection集合体系、List、Set)

集合体系结构 Collection是单列集合的祖宗&#xff0c;它规定的方法&#xff08;功能&#xff09;是全部单列集合都会继承的。 collection集合体系 Collection的常用方法 package com.itchinajie.d1_collection;import java.util.ArrayList; import java.util.HashSet;/* * 目…...

Qt如何调用接口

在Qt中&#xff0c;你可以使用QNetworkAccessManager类来调用API。以下是一个简单的示例&#xff1a; cpp #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> int main(int arg…...

如何3分钟掌握Chat2DB:AI智能数据库管理完整指南

如何3分钟掌握Chat2DB&#xff1a;AI智能数据库管理完整指南 【免费下载链接】Chat2DB AI-driven database tool and SQL client, The hottest GUI client, supporting MySQL, Oracle, PostgreSQL, DB2, SQL Server, DB2, SQLite, H2, ClickHouse, and more. 项目地址: https…...

图片怎么去水印?2026图片去水印方法实测 + 好用工具推荐

图片怎么去水印&#xff1f;2026图片去水印方法实测 好用工具推荐 前言 日常刷图、做设计、整理相册&#xff0c;总免不了碰到这个问题&#xff1a;图片上有水印&#xff0c;该怎么去掉&#xff1f;无论是摄影平台的版权标识、相机自动打上的日期戳、App 角标&#xff0c;还是…...

基于MCP协议的GitHub PR代码审查工具:自动化安全与质量分析

1. 项目概述与核心价值 最近在折腾一个挺有意思的东西&#xff0c;一个专门给GitHub Pull Request做代码审查的MCP服务器。简单来说&#xff0c;它能让你的AI助手&#xff08;比如Cursor里的Claude&#xff09;直接读懂GitHub上的代码变更&#xff0c;然后像一位经验丰富的技术…...

PyTorch深度学习资源大全:如何快速找到最佳教程和项目库的终极指南

PyTorch深度学习资源大全&#xff1a;如何快速找到最佳教程和项目库的终极指南 【免费下载链接】the-incredible-pytorch The Incredible PyTorch: a curated list of tutorials, papers, projects, communities and more relating to PyTorch. 项目地址: https://gitcode.c…...

为什么给 Claude Code 加上 CLAUDE.md 后,它就像换了一个脑子?

我是张大鹏&#xff0c;有十多年 AI 人工智能项目的开发经验&#xff0c;带过不少项目。说实话&#xff0c;最难的不是写代码&#xff0c;是让 AI 真正理解你想要什么。最近给项目加了一份 CLAUDE.md&#xff0c;效果立竿见影——Claude Code 从"莽撞乱撞"变成了&quo…...

大模型微调实战:用百元级GPU打造专属AI助手

测试工程师的AI困局与破局在软件测试领域&#xff0c;我们每天都在与各种文本打交道——测试用例、缺陷报告、自动化脚本、需求文档、评审记录。大语言模型&#xff08;LLM&#xff09;的爆发让我们看到了提效的曙光&#xff0c;但很快就会发现&#xff0c;通用模型对测试业务的…...

三大聚类算法对比

聚类算法核心对比&#xff1a;划分聚类、层次聚类与密度聚类 在无监督学习中&#xff0c;聚类算法根据其核心思想和构建簇的方式&#xff0c;主要分为基于划分、基于层次和基于密度三大类。下表从定义、核心原理、关键步骤及应用场景等方面对这三种主流方法进行了系统性对比。…...

告别时钟线!用三根线搞定高速传输:MIPI C-PHY硬件连接与编码原理详解

告别时钟线&#xff01;用三根线搞定高速传输&#xff1a;MIPI C-PHY硬件连接与编码原理详解 在高速数据传输领域&#xff0c;传统并行总线的时钟同步机制已成为提升速率的瓶颈。MIPI联盟推出的C-PHY标准&#xff0c;以革命性的"三线无时钟"架构打破了这一僵局。本文…...

告别大影像卡顿:手把手教你用GISBox做影像切片

从城市规划的精准布局&#xff0c;到自然资源的合理开发利用&#xff0c;再到应急救援的高效指挥&#xff0c;GIS影像都扮演着至关重要的角色。而影像切片技术&#xff0c;作为GIS影像处理和应用的关键环节&#xff0c;更是为我们解决了诸多实际难题&#xff0c;让GIS影像的应用…...

ARM微服务器与异构计算:从欧洲实验室到现代数据中心的演进

1. 项目概述&#xff1a;欧洲实验室里的微服务器“新酿”最近在整理资料时&#xff0c;翻到一篇2014年EE Times的老报道&#xff0c;讲的是当时欧洲几个由欧盟资助的微服务器项目。虽然时间过去快十年了&#xff0c;但里面探讨的一些架构思路和设计哲学&#xff0c;在今天看来依…...