选择排序和堆排序

目录

前言      

一.选择排序

1.思想

2.实现

3.特点

二.堆排序

1.思想

2.实现

3.特点



前言      

         排序算法是计算机科学中的基础工具之一,对于数据处理和算法设计有着深远的影响。了解不同排序算法的特性和适用场景,能够帮助程序员在特定情况下选择最合适的算法,从而提高程序的效率和性能。本节我们讲述选择排序和堆排序。

一.选择排序

1.思想

基本思想是在未排序的部分中选择最小和最大的元素,然后将其与未排序部分的第一个元素和最后一个交换位置。重复这个过程,直到整个序列有序。

选择排序的步骤如下:

  1. 初始状态: 将整个序列分为已排序部分和未排序部分,初始时已排序部分为空,未排序部分包含所有元素。

  2. 选择最小元素: 在未排序部分中找到最小和最大的元素,并记录其位置。

  3. 交换位置: 将找到的最小元素与未排序部分的第一个元素交换位置。最大元素与最后一个元素交换。

  4. 更新已排序部分和未排序部分: 将交换后的元素视为已排序,将原未排序部分减少二个元素,继续从未排序部分重复步骤2和步骤3。

  5. 重复直至完成: 重复上述过程,直到整个序列有序。

2.实现

void SelectSort(int* a, int n)
{int gap = 0;int end = n - 1;while (gap < end){int maxi = gap, mini = gap;for (int i = gap+1; i <= end; i++){if (a[mini] > a[i]){mini = i;}if (a[maxi] < a[i]){maxi = i;}}Swap(&a[gap], &a[mini]);if (gap == maxi){maxi = mini;}Swap(&a[end], &a[maxi]);gap++;end--;}
}

        注意:为了避免最大值为第一个时,被最小值交换时换走,我们修正一下,如果第一个值就是最大值,那么当第一个值与最小值交换后,修正最大值的位置

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

空间复杂度O(1)

稳定性:不稳定

3.特点

1.优势:

  1. 交换操作相对较少: 选择排序的交换操作次数相对较少,每次只进行一次交换。这使得它在某些场景下可能比冒泡排序更有效。

  2. 适用于小规模数据集: 在数据规模较小的情况下,选择排序的性能可能相对较好,因为其简单性和交换操作的相对少。

2.缺点

  1. 时间复杂度高: 选择排序的时间复杂度为O(n^2),其中n是待排序序列的长度。这意味着对于大规模数据集,选择排序的性能可能相对较差,尤其是与一些O(nlog n)时间复杂度的算法相比。

  2. 不稳定: 选择排序是一种不稳定的排序算法。当存在相等元素时,它可能会改变它们的相对顺序,使得选择排序在某些应用场景中不适用。

  3. 对逆序数据的不足: 在对逆序数据(完全逆序排列的情况)进行排序时,选择排序的性能较差。每次选择最小元素时,都需要在未排序的部分中进行线性搜索,导致交换操作次数较多。

二.堆排序

1.思想

堆排序是一种基于二叉堆(Binary Heap)数据结构的排序算法。堆是一个特殊的树状数据结构,其中每个节点的值都不大于或不小于其子节点的值。堆可以分为最大堆和最小堆。(可以看这个堆的实现与操作-CSDN博客)

堆排序的基本思想如下:

  1. 建堆: 将待排序序列构建成一个二叉堆。对于最大堆,父节点的值大于或等于其子节点的值;对于最小堆,父节点的值小于或等于其子节点的值。

  2. 排序: 不断将堆顶元素与堆的最后一个元素交换,然后对除最后一个元素外的部分重新调整成堆。这样,每次交换后,最大或最小元素就被放置在了正确的位置。重复这个过程,直到整个序列有序。

2.实现

void AdjustDown(int* a,int parent,int size)//向下调整建堆
{int child = parent *2 + 1;while (child < size){if (child+1<size&&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 HeapSort(int* a, int n)//堆排序
{for (int i = (n - 1) / 2; i >= 0; i--){AdjustDown(a, i, n);}int end = n-1 ;while (end){Swap(&a[0], &a[end]);AdjustDown(a, 0, end );end--;}
}

        这里我们采用向下调整建堆,从第一个非叶子节点开始,建大堆后,每次将堆顶元素调整到数组后面,再调整堆

时间复杂度:O(nlogn)

空间复杂度O(1)

稳定性:不稳定

3.特点

1.优势:

  1. 时间复杂度稳定: 堆排序的时间复杂度为O(n log n),其中n是待排序序列的长度。这使得堆排序在大规模数据集上具有相对较好的性能。

  2. 适用于大规模数据: 由于其O(n log n)的时间复杂度,堆排序对于大规模数据集的排序任务是一个较好的选择,特别是相对于一些O(n^2)复杂度的排序算法。

2.缺点:

  1. 不稳定性: 堆排序是一种不稳定的排序算法。在交换的过程中,可能会改变相同元素的相对顺序。对于需要保持相等元素相对位置关系的应用场景,不稳定性可能是一个不可接受的缺点。

  2. 对于小规模数据: 尽管堆排序在大规模数据集上表现良好,但在小规模数据集上,它的性能可能不如一些简单且更容易实现的排序算法,如快速排序或插入排序。

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

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

相关文章

【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(一)搭建项目

前言 最近两个月一直在忙公司的项目&#xff0c;上班时间经常高强度写代码&#xff0c;下班了只想躺着&#xff0c;没心思再学习、做自己的项目了。最近这几天轻松一点了&#xff0c;终于有时间 摸鱼了 做自己的事了&#xff0c;所以到现在我总算是搭起来一个比较完整的后台管…

nrfutil工具安装

准备工作&#xff0c;下载相关安装包 链接&#xff1a;https://pan.baidu.com/s/1LWxhibf8LiP_Cq3sw0kALQ 提取码&#xff1a;2dlc 解压后&#xff0c;分别安装以下安装包 在C盘下创建目录nordic_tools&#xff0c;并将nrfutil复制到刚创建的目录下 环境变量path下添加C:\nor…

图像采集卡 Xtium™2-XGV PX8支持高速 GigE Vision 工业相机

图像采集卡&#xff08;Image Capture Card&#xff09;&#xff0c;又称图像捕捉卡&#xff0c;是一种可以获取数字化视频图像信息&#xff0c;并将其存储和播放出来的硬件设备。很多图像采集卡能在捕捉视频信息的同时获得伴音&#xff0c;使音频部分和视频部分在数字化时同步…

python elasticsearch 日期聚合

索引以及数据如下 PUT dateagg {"mappings": {"properties": {"charge":{"type": "double"},"types":{"type": "keyword"},"create_date":{"type": "date",&…

裸机单片机适用的软件架构

单片机通常分为三种工作模式&#xff0c;分别是 1、前后台顺序执行法 2、操作系统 3、时间片轮询法 1、前后台顺序执行法 利用单片机的中断进行前后台切换&#xff0c;然后进行任务顺序执行&#xff0c;但其实在…

Spring Boot Web

目录 一. 概述 二. Spring Boot Web 1.2.1 创建SpringBoot工程&#xff08;需要联网&#xff09; 1.2.2 定义请求处理类 1.2.3 运行测试 1.3 Web分析 三. Http协议 3.1 HTTP-概述 刚才提到HTTP协议是规定了请求和响应数据的格式&#xff0c;那具体的格式是什么呢? 3…

spring结合设计模式之策略模式

策略模式基本概念&#xff1a; 一个接口或者抽象类&#xff0c;里面两个方法&#xff08;一个方法匹配类型&#xff0c;一个可替换的逻辑实现方法&#xff09;不同策略的差异化实现(就是说&#xff0c;不同策略的实现类) 使用策略模式替换判断&#xff0c;使代码更加优雅。 …

Swagger快速上手

快速开始&#xff1a; 导入maven包 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version> </dependency><dependency><groupId>io.springfox<…

MongoDB在Windows系统和Linux系统中实现自动定时备份

本文主要介绍MongoDB在Windows系统和Linux系统中如何实现自动定时备份。 目录 MongoDB在Windows系统中实现自动定时备份MongoDB在Linux系统中实现自动定时备份备份步骤备份恢复 MongoDB在Windows系统中实现自动定时备份 要在Windows系统中实现自动定时备份MongoDB数据库&#…

区块链实验室(32) - 下载arm64的Prysm

Prysm是Ethereum的共识层。 1. 下载prysm.sh curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod x prysm.sh2. 下载x86版prysm共识客户端 ./prysm.sh beacon-chain --download-only3.下载arm64版prysm共识客…

删除当前目录及其子目录下的重复文件

言归正传&#xff0c;直接看代码 public class RemoveDuplicateFiles {public static void main(String[] args) throws IOException {String directoryPath "D:\\dir";List<File> allFiles getAllFiles(directoryPath);removeDuplicateFile(allFiles);}pri…

HP108w打印机出现Direct.....无线网,连接不上

本人用手机打印的&#xff0c;安卓 这种情况我也不知道为啥出现&#xff0c;如果出现上面的情况&#xff0c;可以 一直按住&#xff0c;会发蓝光的&#xff0c;无线信号样子的按钮&#xff0c;持续按20s&#xff0c;松手后观察自己的wifi列表&#xff0c;本人出现了&#xff…

Linux——web网站服务(一)

一、安装httpd服务器Apache网站服务 1、准备工作 为了避免发送端口冲突&#xff0c;程序冲突等现象&#xff0c;卸载使用rpm方式安装的httpd #使用命令检查是否下载了httpd [rootserver ~]# rpm -qa httpd #如果有则使用 [rootserver ~]# rpm -e httpd --nodeps Apache的配置…

抖音小店经营规则解析:避免被扣分的关键因素

抖音小店是一个受欢迎的电商平台&#xff0c;为创业者提供了良好的销售和推广机会。为了确保在抖音小店的运营中不会被扣分或出现其他问题&#xff0c;不若与众整理了几个关键的规则需要注意和遵守。 1. 产品合规性&#xff1a; 抖音小店要求所有销售的产品必须合法合规&#x…

欣赏动态之美,不如欣赏C语言实现动态内存管理之美 ! ! !

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 &#xff01;&#xff0…

ubuntu解决问题:E: Unable to locate package manpages-posix-dev

sudo apt-get install manpages-posix-dev 想要在ubuntu里面安装manpages-posix-dev这个包&#xff0c;发现弹出错误 E: Unable to locate package manpages-posix-dev 解决方法如下&#xff1a; 1 查看当前ubuntu的版本 abhishekitsfoss:~$ lsb_release -a No LSB module…

python自动化测试实战 —— WebDriver API的使用

软件测试专栏 感兴趣可看&#xff1a;软件测试专栏 自动化测试学习部分源码 python自动化测试相关知识&#xff1a; 【如何学习Python自动化测试】—— 自动化测试环境搭建 【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更…

河南省专业技术人员职称评审之继续教育

&#xff08;一&#xff09;职称评审时会遇到一个关于继续教育学时是否足够的问题&#xff0c;作为新人很容易一头雾水&#xff0c;这里以河南省为例&#xff0c;先在管理系统 http://manage.hnzjgl.gov.cn 注册&#xff0c;根据自己单位选择&#xff0c;有些高校虽然在地方而不…

力扣题:数字与字符串间转换-12.12

力扣题-12.12 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;539. 最小时间差 解题思想&#xff1a;将字符串的时间形式换成数字形式的时间&#xff0c;然后计算差值即可&#xff0c;最重要的是最小的值加上一天的时间加入到数组最后&#xff08…

图文教程:stable-diffusion的基本使用教程 txt2img(多图)

之前我介绍了SD的安装过程&#xff0c;那么这篇将介绍怎么使用SD 使用模型 SD安装好之后&#xff0c;我们只有一个默认的模型。这个模型很难满足我们的绘图需求&#xff0c;那么有2种方法。 1是自己训练一个模型&#xff08;有门槛&#xff09;2是去网站上找一个别人练好的模…