当前位置: 首页 > 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…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...