目录

1.直接选择排序

1.1直接选择排序的思想

1.2直接选择排序的代码逻辑

1.3完整排序代码

1.3.1一次只选一个最值

1.3.2一次筛选出两个最值

1.4直接选择排序的时间复杂度与空间复杂度

2.堆排序

2.1堆排序的思想

2.2堆排序的具体步骤

2.3堆排序图解

2.4完整排序代码

3.冒泡排序

3.1冒泡排序的思想

3.2冒泡排序图解

3.3单趟排序代码(一轮遍历进行的操作) 

3.4完整排序代码

3.5冒泡排序的时间复杂度与空间复杂度


所有排序的实现皆以升序为例

1.直接选择排序

1.1直接选择排序的思想

直接选择排序的思想就是对数组进行多轮遍历,在每一轮遍历中,从当前未排序部分的元素里选出最大值或最小值,然后依据排序要求,将该最大值或最小值与未排序部分的起始位置或末尾位置的元素进行交换,从而逐步确定数组中各元素的最终位置,最终实现数组有序

1.2直接选择排序的代码逻辑

就是根据思想:遍历+筛选

1.3完整排序代码

1.3.1一次只选一个最值

void SelectSortUp1(int* a, int n){for(int j = 0; j < n - 1; ++j){int min = j;for (int i = j + 1; i < n; ++i){if (a[i] < a[min])min = i;}Swap(&a[j], &a[min]);}
}

以升序为例,一次遍历(对未排序部分的遍历)选出的最小值放在未排序部分的起始位置

内层循环进行的是特定的某一次遍历的筛选过程

外层循环控制了每次遍历时的起始位置以及交换过程

1.3.2一次筛选出两个最值

void SelectSortUp2(int* a, int n){int left = 0, right = n - 1;while(left < right){int min = left, max = left;for (int i = left + 1; i <= right; ++i){if (a[i] < a[min])min = i;if (a[i] > a[max])max = i;}Swap(&a[min], &a[left]);if (left == max)max = min;Swap(&a[max], &a[right]);++left;--right;}
}

对思想进行精进,一次遍历,选出未排序部分的最大和最小值,按需将其放在对应位置

leftright 控制的是未排序部分的区间大小

一次遍历选出最大最小值后,以升序为例,

最小值放在未排序部分的起始位置,最大值放在未排序部分的末尾

然后缩小区间

1.4直接选择排序的时间复杂度与空间复杂度

假设数组有N个元素,一次只选出一个最值,则最坏情况下,第一轮遍历需遍历N个元素,第二轮遍历序遍历N-1个元素.............第N-1轮遍历需遍历2个元素,遍历结束,遍历次数为((N+2)*(N-1))/2

所以时间复杂度为O(N^2)

一次筛选出两个最值,则最坏情况下,第一轮遍历大约需遍历N个元素,第二轮遍历需遍历N-2个元素.............一共约遍历N/2轮,遍历次数为 ((2+N)*N)/ 2,时间复杂度为O(N^2)

直接选择排序的变量个数固定,所有操作均在原数组上,所以空间复杂度为O(1) 

2.堆排序

关于堆,可参考前两期博客  数据结构 之 【堆】堆的应用

2.1堆排序的思想

数组可以模拟完全二叉树,堆是一种完全二叉树,且具备选数的功能,那么

将数组持续变为堆,并对特定的堆选出最值,最终可实现数组有序

2.2堆排序的具体步骤

1.建堆:按需将所给数组变为大(小)堆    (建堆的具体步骤参考  堆的应用 这一期博客)

升序建大堆,降序建小堆

2.交换与调整:以升序为例,建成大堆后,将堆顶元素(为未排序部分的最大值)与末尾位置的元素进行交换,然后对末尾位置之前的所有元素进行向下调整操作,使其再次成为大堆,然后交换堆顶元素与未排序部分的末尾位置的元素,........循环进行调整与交换操作,直到未排序部分的元素个数为1为止

2.3堆排序图解

2.4完整排序代码

void AdjustDown(HpDateType* a, int n, int parent){int child = parent * 2 + 1;//有左孩子才进行调整while (child < n)//n是节点个数{//左孩子一个逻辑,右孩子一个逻辑,直接假设//child是左右孩子中较大的一个孩子的下标//注意右孩子的有无(防止越界访问与无效数据)if (child + 1 < n && a[child] < a[child + 1]){++child;}//与左右孩子中较大的一个孩子进行比较if (a[parent] < a[child]){Swap(&a[parent], &a[child]);parent = child;child = parent * 2 + 1;}else    break;}
}
void HeapSortUp(int* a, int n){//从第一个非叶子节点开始建堆for (int i = (n - 2) / 2; i >= 0; --i){AdjustDwon1(a, n, i);}//堆顶元素与末尾交换,并向下调整//显然是循环int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDwon1(a, end, 0);--end;}
}

通过逐步缩小堆的范围来排序数组

当堆中只剩一个元素时(即 end = 0),排序过程已完成, 所以 end > 0 作为循环结束条件

2.5堆排序的时间复杂度与空间复杂度

堆排序的时间复杂度O(N*logN),可用最坏情况下的交换次数进行衡量

空间复杂度为O(1)

3.冒泡排序

3.1冒泡排序的思想

进行多轮遍历,每轮遍历中,依次比较相邻元素,若不符合目标顺序(升序则前大后小,降序则前小后大),就交换它们的位置。如此,每轮遍历会将当前未排序部分的最大(小)值“冒泡”到数组一端。当某一轮遍历无元素交换时,排序完成

3.2冒泡排序图解

3.3单趟排序代码(一轮遍历进行的操作) 

for (int j = 0; j < n - 1; ++j){if (a[j] > a[j + 1]){Swap(&a[j], &a[j + 1]);}
}

上述代码展示的是第一次遍历进行的操作,数组元素两两进行比较,j + 1 < n,所以 j < n - 1

因为是升序,前一个数比后一个数大就交换

3.4完整排序代码

void BubbleSortUp(int* a, int n){//一趟只正确放好一个数//n个数n - 1 趟for(int i = 0; i < n - 1; ++i){//经过一趟少一次比较for (int j = 0; j < n - 1 - i; ++j){if (a[j] > a[j + 1]){Swap(&a[j], &a[j + 1]);}}}
}

冒泡排序遍历一轮可正确放好一个数组元素,则有n个数组元素的数组只需遍历n-1轮

冒泡排序遍历一轮可正确放好一个数组元素,那么遍历一轮可减少一次比较次数

小优化

内层循环未进行交换操作则证明数组有序,此时可终止循环,减少不必要的循环操作

void BubbleSortUp(int* a, int n){//一趟只正确放好一个数//n个数n - 1 趟for(int i = 0; i < n - 1; ++i){int flag = 0;//经过一趟少一次比较for (int j = 0; j < n - 1 - i; ++j){if (a[j] > a[j + 1]){Swap(&a[j], &a[j + 1]);flag = 1;}}if (!flag)break;}
}

3.5冒泡排序的时间复杂度与空间复杂度

 假设数组有N个元素,则最坏情况下,第一轮遍历需交换N-1次,第二轮遍历需交换N-2次,

.............第N-1轮遍历需交换1次,交换总次数为 ((N-1)*N) / 2, 时间复杂度为O(N^2)

变量个数固定,所有操作均在原数组上,空间复杂度为O(1) 

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

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

相关文章

用手机当外挂-图文并茂做报告纪要

前阵参加一个峰会,看到演讲嘉宾每翻一页PPT,下面的观察就举起手机一顿拍。实话说这种拍下来的,难说还会拿出来看,而且再看的时候也未必能对应到当时主讲人的一些解释 。 如果现场将图片保存到笔记本电脑,并快速记录关键信息,这样听完一个报告可能就直接输出一篇报道了。 有…

Vue的ubus emit/on使用

这段代码是 Vue.js 组件中的 mounted 生命周期钩子函数&#xff0c;主要作用是监听一个名为 “macSelectData” 的全局事件。具体行为如下&#xff1a;分步解释&#xff1a;mounted() 生命周期钩子 当组件被挂载到 DOM 后&#xff0c;Vue 会自动调用 mounted() 方法。这里常用于…

rsync报错解决

问题说明 [rootlocalhost shyn]# rsync -avz --checksum "root192.168.159.133:/tmp/shyn" "/tmp /shyn"WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! …

ArKTS: DAL,Model,BLL,Interface,Factory using SQLite

HarmonyOS 用ohos.data.rdb 用DBHelper.ets 共用调用SQLite 库&#xff0c;进行DAL,Model,BLL,Interface,Factory 框架模式&#xff0c;表为CREATE TABLE IF NOT EXISTS signInRecord ( id INTEGER PRIMARY KEY AUTOINCREMENT, employeeId TEXT NOT NULL, employeeName TEXT NO…

MySQL JSON 数据类型用法及与传统JSON字符串的对比 JSON数据类型简介

文章目录前言1. 基本用法JSON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引支持JSON存储对象和数组的性能考虑1. 存储对象2. 存储数组性能对比总结最佳实践建议前言 MySQL从 5.7 版本开始引入了 JSON 数据类型&#xff0c;专门用于存储 JSON 格式的数据。与传…

C++:list(1)list的使用

list的使用一.list基本的结构1.环状双向链表2.哨兵节点3.迭代器4.节点结构5.链表遍历6.迭代器失效二.list的基本使用1.test01函数&#xff1a;主要测试std::list的初始化方式及遍历2.test02函数&#xff1a;主要测试std::list的常用成员函数操作3.测试结果如下三.list的其他操作…

ArcGIS地形起伏度计算

地形起伏度计算地形起伏度步骤1&#xff1a;计算最大值。步骤2&#xff1a;计算最小值。步骤3&#xff1a;计算地形起伏度。地形起伏度、地形粗糙度、地表切割深度和高程变异系数均为坡面复杂度因子&#xff0c;是一种宏观的地形信息因子&#xff0c;反映的是较大的区域内地表坡…

llama factory新手初步运行完整版

1、新建conda环境名称为llama_factory&#xff0c;并激活 conda create -n llama_factory python3.10 conda activate llama_factory2、激活后可检查内部包是否纯净&#xff0c;要确保环境内包较纯净&#xff0c;不然后续安装对应包会出现一系列水土不服的问题&#xff0c;导致…

Tomcat与JDK版本对照全解析:避坑指南与生产环境选型最佳实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

短视频矩阵的未来前景:机遇无限,挑战并存

在当今数字化信息飞速传播的时代&#xff0c;短视频以其独特的魅力迅速席卷全球&#xff0c;成为人们获取信息、娱乐消遣的重要方式之一。短视频矩阵作为一种高效的内容传播与运营模式&#xff0c;正逐渐展现出其强大的影响力和潜力。本文将深入探讨短视频矩阵的未来前景&#…

【数据结构】哈希——位图与布隆过滤器

目录 位图&#xff1a; 引入 位图实现&#xff1a; 位图的结构 插入数据(标记数据) 删除数据(重置数据) 查找数据 位图完整代码&#xff1a; 位图的优缺点&#xff1a; 布隆过滤器&#xff1a; 引入 布隆过滤器实现&#xff1a; 布隆过滤器的结构&#xff1a; 插入…

本地运行C++版StableDiffusion!开源应用StableVerce发布

本地运行C版StableDiffusion&#xff01;开源应用StableVerce发布 StableVerse是一个用C开发的本地运行的图形工具。适合初学者快速入门&#xff1b;适用于办公室工作人员的文本和图像制作的小规模计算能力场景。 开源地址&#xff1a;https://github.com/kelvin-luo/StableVer…

OpenLayers 快速入门(七)矢量数据

看过的知识不等于学会。唯有用心总结、系统记录&#xff0c;并通过温故知新反复实践&#xff0c;才能真正掌握一二 作为一名摸爬滚打三年的前端开发&#xff0c;开源社区给了我饭碗&#xff0c;我也将所学的知识体系回馈给大家&#xff0c;助你少走弯路&#xff01; OpenLayers…

【PTA数据结构 | C语言版】关于堆的判断

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 将一系列给定数字顺序插入一个初始为空的最小堆。随后判断一系列相关命题是否为真。命题分下列几种&#xff1a; x is the root&#xff1a;x是根结点&#xff1b;x and y are siblings&#xff1a…

[CH582M入门第十步]蓝牙从机

前言 学习目标: 1、初步了解BLE协议 2、BLE从机代码解析 3、使用手机蓝牙软件控制CH582M从机LED亮灭一、蓝牙介绍 蓝牙(Bluetooth)是一种短距离无线通信技术,主要用于设备之间的数据传输和通信。它由爱立信(Ericsson)于1994年提出,现由蓝牙技术联盟(Bluetooth SIG)维…

力扣(LeetCode) ——轮转数组(C语言)

题目&#xff1a;轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例1&#xff1a; 输入&#xff1a; nums [1,2,3,4,5,6,7]&#xff0c;k 3 输出&#xff1a; [5,6,7,1,2,3,4] 解释&#xff1a; 向右轮转 1 步:…

Rocky9部署Zabbix7(小白的“升级打怪”成长之路)

目录 一、关闭防火墙和SElinux和配置安装源 二、zabbxi服务器配置 1、安装Zabbix server&#xff0c;Web前端&#xff0c;agent &#xff0c;mysql-server 2、配置mysql数据库 3、为Zabbix server配置数据库 4、启动对应服务 三、登录zabbix 四、客户端部署 五、解决中…

python安装package和pycharm更改环境变量

安装numpy包 1、找到对应python版本的numpy包的版本 NumPy - News确认适配python版本的numpy&#xff0c;我安装 的python是3.11所以安装的numpy是2.2.0 2、修改pip安装的镜像源 1、全局修改&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.c…

Redis中的setnx命令为什么是原子性的

Redis的SETNX命令是一个原子性操作&#xff0c;这得益于其单线程架构的特性。Redis采用单线程模型&#xff0c;所有命令都在主线程中顺序执行&#xff0c;确保每个操作都具有原子性。执行SETNX时&#xff0c;Redis会首先检查指定key是否存在&#xff1a;若不存在则设置值并返回…

深入解析Hadoop中的EditLog与FsImage持久化设计及Checkpoint机制

HDFS元数据管理概述在HDFS&#xff08;Hadoop Distributed File System&#xff09;的架构中&#xff0c;元数据管理是保证系统可靠性和性能的核心环节。NameNode作为HDFS的主节点&#xff0c;负责维护整个文件系统的命名空间和文件到数据块的映射关系。这些元数据的高效管理直…