[数据结构] 基于选择的排序 选择排序堆排序

标题:[数据结构] 基于选择的排序 选择排序&&堆排序

@水墨不写bug


(图片来源于网络)


目录

(一)选择排序

实现:(默认从小到大排序)

优化后实现方法:

(二)堆排序

实现: (从小到大排序)


 

正文开始:

(一)选择排序

        时间复杂度:O(N^2)

        空间复杂度:O (1)

        稳定性:不稳定

基本思想:

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

实现:(默认从小到大排序)


void SelectSort(vector<int>& nums)
{int n = nums.size();int begin = 0, end = n - 1;for (int j = 0; j < n-1; ++j){int maxi = 0;for (int i = 0; i < n-j; ++i){if (nums[maxi] < nums[i]){maxi = i;}}swap(nums[end--], nums[maxi]);}
}

选择排序仍然有一种优化方法:

        每次选择的时候,可以同时选择两个数,这样就可以减少遍历的次数,提高效率。

优化后实现方法:


void SelectSort(vector<int>& nums)
{int n = nums.size();int begin = 0, end = n - 1;while(begin < end){int maxi = begin, mini = begin;for (int i = begin; i <= end; ++i){if (nums[maxi] < nums[i]){maxi = i;}if (nums[mini] > nums[i]){mini = i;}}swap(nums[mini], nums[begin]);if (maxi == begin){maxi = mini;}swap(nums[maxi], nums[end]);begin++;end--;}
}

 但是这种实现方法会导致一个问题:

        由于每次选两个值,当最大值下标就是区间左端点时,由于需要将最小值放在左端点,这样会使最大值下标失效于是就需要修正最大值下标:

        当最小值下标与区间左端点begin交换后,判断最大值下标是否指向区间左端点,如果是,则将其修正为交换后的最小值下标的位置。

下标交换只有四种情况:

其实这个问题的本质是:

        将最小值交换到最前面的操作是先进行的,先进行的过程会对后进行的过程产生干扰。

        最小值下标与区间左端点交换导致的最大值下标失效的问题,需要修正最大值下标。

(二)堆排序

 堆排序实现过程:默认排升序

        时间复杂度:O(N*logN)

        空间复杂度:O(1)

        稳定性:不稳定

        特点:小堆排降序,大堆拍升序。

        小堆可以得到最小的数,然后将最小的数排除,在剩余的数中再次找到最小的数,依次类推;大堆类似。

实现原理:

        用到了向下调整法建堆的过程:以大堆排升序为例

        一般堆是由连续的数组模拟实现的逻辑结构,每次将堆顶最大的数移动到数组末尾后,需要向下调整来保持堆的特性。在向下调整之后,最大值就到了数组的末尾,堆也保持了其特性,接下来继续重复即可。

实现: (从小到大排序)


void AdgustDown(vector<int>& nums,int pos,int size)
//排序的过程size是变化的,动态的,每完成一个数据,size要动态减小
{int n = size;int parent = pos;//find max childint child = pos * 2 + 1;while (child < n){//假设左孩子大if (child + 1 < n && nums[child] < nums[child + 1]){child++;}if (nums[parent] < nums[child]){swap(nums[parent], nums[child]);parent = child;child = parent * 2 + 1;}else{break;}}
}
//大堆排升序
void HeapSort(vector<int>& nums)
{int n = nums.size();//建堆过程for(int i = (n-1-1)/2;i >= 0;--i){ AdgustDown(nums, i,n);}Print(nums);//排序过程for(int j = 0; j < n;++j){int size = n - 1 - j;swap(nums[0], nums[size]);AdgustDown(nums, 0, size);}
}
int main()
{vector<int> nums = { 99,0,7,5,44,3,78,653,90,81 };Print(nums);HeapSort(nums);Print(nums);return 0;
}

完~

未经作者同意禁止转载 

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

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

相关文章

【Java】垃圾回收学习笔记(二):分代假说与垃圾回收算法

文章目录 0. 分代收集理论分代假说分代GC定义 1. 垃圾回收算法1.1 标记清除&#xff08;Mark-Sweep&#xff09;算法优点缺点 1.2 标记复制算法优点缺点为什么是8:1:1&#xff1f; 1.3 标记整理算法优点缺点 2. 是否移动&#xff1f;Reference 0. 分代收集理论 分代假说 现在…

Navicat和MySQL的安装

1、下载 Navicat Navicat 官网&#xff1a;www.navicat.com.cn/ 在产品中可以看到很多的产品&#xff0c;点击免费试用 Navicat Premium 即可&#xff0c;是一套多连数据库开发工具&#xff0c;其他的只能连接单一类型数据库 点击试用 选择系统直接下载 二、安装 Navicat 安…

element el-table实现表格动态增加/删除/编辑表格行,带校验规则

本篇文章记录el-table增加一行可编辑的数据列&#xff0c;进行增删改。 1.增加空白行 直接在页面mounted时对form里面的table列表增加一行数据&#xff0c;直接使用push() 方法增加一列数据这个时候也可以设置一些默认值。比如案例里面的 产品件数 。 mounted() {this.$nextTi…

linux创建定时任务

crontab方式 先查看是否有cron systemctl status crond 没有的话就安装 yum install cronie 打开你的crontab文件进行编辑。使用以下命令打开当前用户的crontab文件&#xff1a; crontab -e * * * * * /export/test.sh >> /export/test.log 2>&1/export/test.s…

差分算法中的F 和CR参数

自查使用。。F 类似梯度的大小 两者都用于种群中新个体的生成

leetcode--从中序与后序遍历序列构造二叉树

leeocode地址&#xff1a;从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder …

Unity插件 Unitask学习日志

Unity插件 Unitask学习日志 下载地址 https://github.com/Cysharp/UniTask点击这里可以查阅中文文档 在Unity 2020,2021 中使用UPM下载会找不到&#xff0c;可以使用2022版本的unity可以在upm中找到。 安装方式&#xff1a; 下载zip之后解压&#xff0c; 复制Plugins 到Uni…

01. 数组篇(进行中......)

一. 前缀和技巧 &#xff08;1&#xff09;前缀和 前缀和技巧适用于快速、频繁地计算一个索引区间内的元素之和。 class NumArray { public:vector<int> preSum; //前缀和数组NumArray(vector<int>& nums) {//preSum[0] 0&#xff0c;便于计算累加和preSum…

Spring中的工厂模式详解及应用示例

1. Spring中的BeanFactory BeanFactory是一个接口&#xff0c;表示它是一个工厂&#xff0c;负责生产和管理bean。在Spring中&#xff0c;BeanFactory是IOC容器的核心接口&#xff0c;定义了管理Bean的通用方法&#xff0c;如 getBean 和 containsBean。 BeanFactory与IOC容器…

Python编程:如何有效等待套接字的读取与关闭

背景介绍 网络编程是现代应用程序开发的重要组成部分&#xff0c;尤其是在大数据和实时通信的背景下。套接字&#xff08;Socket&#xff09;作为网络通信的核心技术&#xff0c;是开发网络应用程序的基础。在Python编程中&#xff0c;如何有效地等待套接字的读取与关闭事件是…

柔性测斜仪:监测钻孔位移的核心利器

柔性测斜仪&#xff0c;作为一款创新的测量工具&#xff0c;凭借其卓越的设计与性能&#xff0c;在地下建筑、桥梁、隧道及水利水电工程等领域展现出非凡的应用价值。其安装便捷、操作简便、高精度及长寿命等特性&#xff0c;使之成为监测钻孔垂直与水平位移的理想选择。以下是…

【ComfyUI的API接口调用示例】

ComfyUI的API接口调用示例 本文目的 本文调用接口示例主要指导需要调用ComfyUI的开发者如何调用ComfyUI官方的API接口提交任务、查询历史、获取绘画视频结果等。 阅读本文的前提是你本地已经安装了ComfyUI&#xff0c;并且对工作流绘画和生成视频已经有所了解。注意如图右边栏…

arm架构安装chrome

在ARM架构设备上安装谷歌软件或应用通常涉及到几个步骤&#xff0c;这取决于你要安装的具体谷歌产品&#xff0c;比如谷歌浏览器、Google Play服务或者是其他谷歌开发的软件。下面我会给出一些常见的指导步骤&#xff0c;以安装谷歌浏览器为例&#xff1a; 在Linux ARM64上安装…

零基础做项目---五子棋对战---day02

用户模块 完成注册登录&#xff0c;以及用户分数管理~使用数据库来保存上述用户信息. 使用 MyBatis来连接并操作数据库了 主要步骤: 1.修改 Spring的配置文件,使数据库可以被连接上. 2.创建实体类&#xff0c;用户, User 3.创建Mapper接口~ 4.实现MyBatis 的相关xml配置…

MySQL安全值守常用语句

一、用户权限设置 1、Mysql中用户是如何定义的 用户名主机域 10.0.0.5110.0.0.%%10.0.0.0/255.255.255.0Db01Localhost127.0.0.1 2、用户创建 create user xinjing% identified by 123 3、用户删除 drop user username&#xff1b;username 是要删除的用户名:如 drop user root…

GDidees CMS v3.9.1 本地文件泄露漏洞(CVE-2023-27179)

前言 CVE-2023-27179 是一个影响 GDidees CMS v3.9.1 及更低版本的任意文件下载漏洞。这个漏洞存在于 /_admin/imgdownload.php 文件中&#xff0c;攻击者可以通过向 filename 参数传递恶意输入来下载服务器上的任意文件。 漏洞的根源在于对用户输入的 filename 参数处理不当…

【C++修行之道】string类练习题

目录 387. 字符串中的第一个唯一字符 125. 验证回文串 917. 仅仅反转字母 415. 字符串相加&#xff08;重点&#xff09; 541. 反转字符串 II 387. 字符串中的第一个唯一字符 字符串中的第一个唯一字符 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s &#…

中霖教育怎么样?税务专业可以考哪些证书?

在税务专业领域&#xff0c;专业技能的认证对职业发展至关重要。以下为税务专业相关可以考的证书&#xff1a; 1. 注册税务师资格证书&#xff1a;该证书是税务专业人士的关键资质&#xff0c;使持证者可以从事税务相关工作。 2. 会计职称证书&#xff1a;会计系列证书分为初…

笔记本系统

笔记本更新升级 笔记本购入太早&#xff0c;所用内存只有4G&#xff0c;通过更好内存条升级系统性能 查看电脑支持内存大小 cmd命令输入wmic memphysical get maxcapacity 这串数字就是电脑最大支持内存数值&#xff0c;做除法除两次1024&#xff01;&#xff0c;得出来的…

查看oracle ojdbc所支持的JDBC驱动版本

oracle jcbc驱动的下载地址参考&#xff1a;JDBC and UCP Downloads page 其实上文中对ojdbc所支持的JDBC驱动版本已经有说明了&#xff0c;不过&#xff0c;因为oracle的驱动包很多时间&#xff0c;都是在公司内部私服里上传维护的&#xff0c;上传的时候&#xff0c;可能又没…