<数据结构>NO9.选择类排序|直接选择排序|堆排序

文章目录

  • 选择排序
    • 1.直接选择排序
      • 优化直接选择排序
    • 2. 堆排序

在这里插入图片描述

选择排序

基本思想
选组排序是从待排序数据中选出最大/最小的元素放入到序列的起始位置,直到待排序数据全部有序。

直接选择排序和堆排序的基本思想均符合选择排序。

1.直接选择排序

假设数据按升序排序

基本步骤

  1. 在待排序数据arr[i]-arr[n-1]中选出最小元素
  2. 如果选出的min不处于待排数据第一个位置时,交换min与arr[i]
  3. 重复上述操作直至待排序数据全部有序

下面动图演示直接选择排序

在这里插入图片描述

代码

void SelectSort(int* arr, int sz)
{int left = 0;while (left < sz - 1){int minPos = left;//每次将待排序数组第一个元素设置为最小值//选出待排序数据中最小值for (int i = left; i < sz; i++){if (arr[i] < arr[minPos]){minPos = i;}}//交换最小值和arr[left]的位置if (minPos != left)Swap(arr[minPos], arr[left]);//更新待排序数据left++;}
}

注意
这里Swap函数参数使用的是C++的引用,所以不需要传地址

优化直接选择排序

直接选择排序是从一边开始排序,优化后的选择排序可以一趟选出最大值和最小值
最小值放在待排序数组第一个位置,最大值放在待排序数组最后一个位置,从两头开始排序。

void SelectSort(int* arr, int sz)
{int left = 0;int right = sz - 1;while (left < right){int minPos = left;int maxPos = left;//选出待排序区间最值for (int i = left; i <= right; i++){if (arr[minPos] > arr[i])minPos = i;if (arr[maxPos] < arr[i])maxPos = i;}//最大值放在区间末尾Swap(arr[maxPos], arr[right]);//如果最小值在末尾,修正最小值if (minPos == right)minPos = maxPos;//最小值放在区间首部Swap(arr[minPos], arr[left]);//更新待排序区间left++;right--;}
}

直接选择排序性能分析:

  1. 无论是直接选择排序还是优化后的直接选择排序时间复杂度都是 O ( n 2 ) O(n^2) O(n2)
  2. 空间复杂度均为 O ( 1 ) O(1) O(1)
  3. 不稳定
  4. 实际生活中很少使用直接选择排序,效率低

2. 堆排序

堆排序是根据堆这种数据结构设计的一种算法,他是选择排序的一种。

堆排序的基本思想

  1. 将待排序数据构建为堆
  2. 交换堆顶元素和最后一个元素
  3. 对堆进行调整使之满足堆的性质
  4. 重复上述过程直至所有元素均有序

代码实现

void AdjustDown(int* a, int sz, int parent)
{int child = parent * 2 + 1;while (child < sz){//大堆逻辑-->排升序if (child + 1 < sz && a[child] < a[child + 1])child++;if (a[parent] < a[child]){Swap(a[parent], a[child]);parent = child;child = child * 2 + 1;}elsebreak;}
}
void HeapSort(int* arr, int sz)
{//向下建大堆-->排升序for (int i = (sz - 2) / 2; i >= 0; i--)AdjustDown(arr, sz, i);//排序int end = sz - 1;while (end > 0){Swap(arr[0], arr[end]);AdjustDown(arr, end, 0);end--;}
}

关于堆排序详细解释请移步堆的应用

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

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

相关文章

时间序列预测 | Matlab基于粒子群算法(PSO)优化径向基神经网络(PSO-RBF)的时间序列预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测| Matlab基于粒子群算法(PSO)优化径向基神经网络(PSO-RBF)的时间序列预测 评价指标包括:MAE、MBE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变量 warni…

改进二进制粒子群算法在配电网重构中的应用(Matlab实现)【论文复现】

目录 0 概述 1 配电网重构的目标函数 2 算例 3 matlab代码实现 0 概述 配电系统中存在大量的分段开关和联络开关&#xff0c;配电网重构正是通过调整分段开关和联络升大的组合状态来变换网络结构,用于优化配电网某些指标&#xff0c;使其达到最优状态。正常运行时,则通过两…

高效工作:ADManager Plus的利器

在当今快节奏的商业环境中&#xff0c;高效的工作是成功的关键。对于IT管理员来说&#xff0c;管理和维护Active Directory&#xff08;AD&#xff09;环境是一项重要的任务。然而&#xff0c;手动处理繁琐的AD管理任务可能会占用大量的时间和精力&#xff0c;影响工作效率。为…

RLHF-基于人类反馈的强化学习

RLHF 文章目录 RLHF强化学习基础回顾为什么要使用基于人类反馈的强化学习大纲RLHF的起源大预言模型中的RLHF案例 ChatGPT RLHF中的技术细节预训练语言模型训练奖励模型基于RL进行微调 RLHF 的未来 强化学习基础回顾 智能体通过采取行动与环境进行交互&#xff0c;并返回状态和奖…

SpringCloud微服务(三)RabbitMQ、SpringAMQP、elasticsearch、DSL、MQ、ES详细介绍

目录 一、初始MQ 同步调用 异步调用 什么是MQ 执行下面的命令来运行MQ容器&#xff1a; 如果冲突了&#xff0c;可以先查询 RabbitMQ概述 常见消息模型 HelloWorld案例 二、SpringAMQP 引入依赖 Work Queue 消费预取限制 ​编辑 发布、订阅 发布订阅Fanout Ex…

能不能推荐个 vue 后台管理系统模板?

前言 下面是我整理的vue2和vue3的一些后台管理系统模板&#xff0c;希望对你有帮助~ Vue2 1、iview-admin Star: 16.4k 基于 iview组件库开发的一款后台管理系统框架&#xff0c;提供了一系列的强大组件和基础模板&#xff0c;方便开发人员快速搭建一套功能丰富、界面美观、…

红帽回应对开源的承诺

导读红帽上周宣布了限制源代码访问性的政策&#xff0c;称其企业发行版 RHEL (Red Hat Enterprise Linux) 相关源码仅通过 CentOS Stream 公开&#xff0c;付费客户和合作伙伴可通过 Red Hat Customer Portal 访问到源代码。 红帽上周宣布了限制源代码访问性的政策&#xff0c…

在Microsoft Excel中带单位的数字如何求和

使用 Excel 中的 SUM 函数对一系列单元格、整列或非连续单元格求和。要创建出色的 SUM 公式&#xff0c;请将 SUM 函数与其他 Excel 函数结合使用&#xff0c;然而 SUM 函数不能直接对带单位的数字进行求和。 当直接相加带单位的几个数字会出现如下错误&#xff1a; 错误的原因…

Keepalived 安装与配置

安装 Keepalived apt -y install keepalived 里边有一个杠y&#xff0c;就是我安装的时候里面有yes&#xff0c;就直接是yes 添加 Keepalived 配置 安装好之后, 下一步就开始去来写这个配置文件了&#xff0c;就在这里面去建一个 etc 当中&#xff0c;就是在这个 etc 当中建一个…

HTTP第17讲——Cookie机制

Cookie的诞生背景 HTTP 是“无状态”的&#xff0c;这既是优点也是缺点。优点是服务器没有状态差异&#xff0c;可以很容易地组成集群&#xff0c;而缺点就是无法支持需要记录状态的事务操作。 后来发明的 Cookie 技术&#xff0c;给 HTTP 增加了“记忆能力”。 什么是Cookie…

SpringBoot中集成Flyway实现数据库sql版本管理入门以及遇到的那些坑

场景 Git/ SVN 是代码界的版本控制工具&#xff0c;那么&#xff0c;Flyway 就是一款数据库界的版本控制工具&#xff0c; 它可以记录数据库的变化记录。可能很多公司都是通过人工去维护、同步数据库脚本&#xff0c; 但经常会遇到疏忽而遗漏的情况&#xff0c;举个简单的例…

汽车EBSE测试流程分析(三):通过系统调研确定改进方案

EBSE专题连载共分为“五个”篇章。此文为该连载系列的“第三”篇章&#xff0c;在之前的“篇章&#xff08;二&#xff09;”中已经分析了EBSE步骤一&#xff1a;关于优势和挑战的案例研究。在本篇章&#xff08;三&#xff09;中&#xff0c;我们将结合具体研究实践&#xff0…