堆排序+选择排序详解

news/2025/1/10 9:44:55/

目录

1.选择排序的定义

2.选择排序的优缺点

2.1优点

2.2缺点

3.思考

4.优化后的选择排序的实现

5.选择排序的代码

6.堆排序

7.向上/向下调整算法

8. 向下向上调整代码

9.堆排序代码


1.选择排序的定义

选择排序(SelectSort),以第一个为开始值,从下一个元素开始,依次寻找比开始值大/小的元素,当找到最大/小的下标,此时将开始值与找到的元素进行交换,这样就实现了最大/小元素的正确去向。按照这种方式,从第一个元素一直进行到倒数第二个元素,此时就是一个有序的数组。

如图所示

2.选择排序的优缺点

2.1优点

  • 相较于其他排序算法,选择排序易于理解
  • 更加适用于入门级学者

2.2缺点

虽然选择排序实现较为简单,首当其冲的就是他的时间复杂度,

结果一目了然,与快速排序,堆排序等相比时间复杂度较差,他的简单带来的后果就是时间复杂度较差。

3.思考

既然选择排序是从第一个开始寻找最大/小的,那么可不可以同时寻找最大和最小,并且将他们放到正确的位置,这样就可以大大提升了选择排序的时间复杂度了。

4.优化后的选择排序的实现

首先要有begin和end,begin位置记录最小值,end位置记录最大值。接着就是循环条件就是i=begin+1,是从begin后面开始比较的,一直循环到end,每次i++。循环里面首先就是让mini和maxi为begin,如果有比最值更小/大的值,那就修改最值的下标。当一次循环之后,然后就是让最值去正确位置,接着begin++,end--,这样就实现了选择排序。

注意:

如果没有这个代码的话,第一个是最大的,当交换一次之后,最小值到了begin,然后最大值还是begin与end交换就错误了。

5.选择排序的代码

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

6.堆排序

堆排序(HeapSort),堆排序是通过建堆,然后调整,来实现排序的。堆排序着较好的时间复杂度,同时堆排序也较难理解的一种排序。

7.向上/向下调整算法

详细介绍见https://blog.csdn.net/wdnmdfky/article/details/143948778?spm=1001.2014.3001.5501

8. 向下向上调整代码

void AdjustDown(int *arr,int parent,int n)
{int child=parent*2+1;while(child<n){if(child+1<n&&arr[child]<arr[child+1]){child++;}if(arr[child]>arr[parent]){Swap(&arr[parent],&arr[child]);parent=child;child=parent*2+1;}else{break;}}}

9.堆排序代码

void HeapSort(int *arr,int n)
{for(int i=(n-1-1)/2;i>=0;i--){AdjustDown(arr,i,n);}int end=n-1;while(end>0){Swap(&arr[end],&arr[0]);AdjustDown(arr,0,end);end--;}
}


http://www.ppmy.cn/news/1561959.html

相关文章

rust学习——环境搭建

rust安装&#xff1a;https://kaisery.github.io/trpl-zh-cn/ch01-01-installation.html 1、vscode装插件&#xff1a; toml语法支持 依赖管理 rust语法支持 2、创建demo 3、查看目录 4、执行文件的几种方式&#xff1a; rust安装&#xff1a;https://www.rust-lang.org/z…

移动 web :平面转换,渐变

平面转换 平移效果 平移实现居中效果 双开门案例 &#xff1a; 设置父级背景图片&#xff0c;子级两张图片在父级上&#xff0c;分别占据 50%的宽度设置鼠标悬停效果&#xff0c;鼠标悬停&#xff0c;那么两张子级图片分别左右平移&#xff0c;而且设置过渡效果再在父级中设置溢…

Linux(Centos 7.6)命令详解:mkdir

1.命令作用 如果目录还不存在&#xff0c;则创建目录(Create the DIRECTORY, if they do not already exist.) 2.命令语法 Usage: mkdir [OPTION]... DIRECTORY... 3.参数详解 OPTION: -m, --modeMODE&#xff0c;创建新目录同时设置权限模式-p, --parents&#xff0c;创…

UE5 使用内置组件进行网格切割

UE引擎非常强大&#xff0c;直接内置了网格切割功能并封装为蓝图节点&#xff0c;这项功能在UE4中就存在&#xff0c;并且无需使用Chaos等模块。那么就来学习下如何使用内置组件实现网格切割。 1.配置测试用StaticMesh 对于被切割的模型&#xff0c;需要配置一些参数。以UE5…

给定一个字符串,对该字符串进行删除操作,保留 k 个字符且相对位置不变,使字典序最小

这是一个经典的编程问题&#xff0c;可以用 单调栈 的方法高效解决。以下是解题步骤和代码实现&#xff1a; 问题描述 给定一个字符串 s 和一个整数 k&#xff0c;要求删除字符串中的一些字符&#xff0c;最终保留 k 个字符&#xff0c;且相对顺序不变&#xff0c;使得结果字符…

从低危Blind SSRF到严重漏洞

视频教程在我主页简介或专栏里 SSRF简介 服务器端请求伪造&#xff08;SSRF&#xff09;是一种Web安全漏洞&#xff0c;它允许攻击者使服务器端应用程序向非预期的位置发送请求。这可能导致攻击者迫使服务器连接到组织内部基础设施中仅限内部访问的服务。在其他情况下&#xf…

Maven核心与单元测试

目录 一. Maven概述二. IDEA集成Maven2.1 创建Maven项目2.2 Maven坐标2.3 导入Maven项目 三. 依赖管理四. Maven的生命周期五. 单元测试5.1 快速入门5.2 断言5.3 常见注解5.4 依赖范围 六. Maven常见问题 \quad 一. Maven概述 \quad \quad 二. IDEA集成Maven \quad 2.1 创建Mav…

python无需验证码免登录12306抢票 --selenium(2)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 [TOC](python无需验证码免登录12306抢票 --selenium(2)) 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 就在刚刚我抢的票&#xff1a;2025年1月8日…