【选择排序】手撕八大排序之直接选择排序和堆排序

news2025/1/11 23:59:19

目录

一.选择排序

1.直接选择排序

2.堆排序


一.选择排序

1.直接选择排序

选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是每次遍历找到最小(或最大)的元素然后将其放置在已排序序列的末尾。在每次遍历过程中,选择排序从未排序部分中选择最小(或最大)的元素,依次放置到已排序序列的末尾,直到所有元素都排序完毕。

这里我们选择同时选择最大和最小的的数,然后放在数组头和数组尾。
这是非常好理解的,如下图所示:

//直接选择排序
void SelectSort(int* a, int left,int right)
{
	//注意这里的left和right都是下标
	while (left < right)
	{
		int begin = left;
		int end = right;
		int max = end;
		//注意这里的max和min的取值等于begin或者end,因为之后找最大和最小
		//都是在begin和end的区间找,如果你将min赋值为0,就会出错
		int min = end;
		for (int i = begin; i <= end; i++)
		{
			if (a[i] > a[max])
			{
				max = i;//找出最大数的下标
			}
			if (a[i] < a[min])
			{
				min = i;//找出最小数的下标
			}
		}
		Swap(&a[begin], &a[min]);
		if (begin == max)
		{
			max = min;
		}
		Swap(&a[end], &a[max]);
		left++;
		right--;
	}
}

注意这里还有一个很重要的点需要注意。 这个代码是什么意思?

if (begin == max)
{
	max = min;
}

可以看出,交换后,并没有使得最大和最小的数,放在数组的两端,就是数组没交换前,max就已经和begin重叠了, 这样原本max的值就跑到min上面去了,所以我们要加这个代码,避免这种情况。

直接选择排序的特性总结:
1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
2. 时间复杂度: O(N^2)
3. 空间复杂度: O(1)
4. 稳定性:不稳定

2.堆排序

这里我们把代码放在这里,之前小陈同学已经把堆排序写得很清楚了,不懂的可以点击链接跳转过去看:堆的实现+堆的应用

//交换函数
void Swap(int* p1, int* p2)
{
	int ret = *p1;
	*p1 = *p2;
	*p2 = ret;
}
//向下调整法
void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;
	while (child<n)
	{
		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 HeapSort(int* a, int n)
{
	for (int i = (n-1-1)/2; i>=0; i--)
	{
		AdjustDown(a, n, i);
	}
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[end], &a[0]);
		AdjustDown(a, end, 0);
		end--;
	}
}

 

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

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

相关文章

实操接口自动化测试项目之项分层设计

本文以笔者当前使用的自动化测试项目为例&#xff0c;浅谈分层设计的思路&#xff0c;不涉及到具体的代码细节和某个框架的实现原理&#xff0c;重点关注在分层前后的使用对比&#xff0c;可能会以一些伪代码为例来说明举例。 接口测试三要素&#xff1a; 参数构造发起请求&a…

JS 1.如何实现继承 2.原型和原型链

1_使用class实现继承 /** 继承 */ class Person { constructor(name) { this.name name;}drink() { console.log(喝水)} }class Student extends Person{ constructor(name, score) { // new Personsuper(name);this.score score;}introduce() { console.log(我是${this.nam…

EasyCVR播放设备录像出现部分视频不能播放的原因排查与解决

EasyCVR视频融合平台基于云边端协同架构&#xff0c;具有强大的数据接入、处理及分发能力。平台支持多协议接入&#xff0c;包括&#xff1a;国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等&#xff0c;对外可分发多格式视频流&#xff0c;包括RTSP、…

栈和队列(二) 队列的实现,用栈实现队列,用队列实现栈,设计循环队列

文章目录 队列的实现用队列实现栈用栈实现队列设计循环队列 队列的实现 这里的队列我们使用链式队列&#xff0c;好处就是可以很方便的取出队头的元素。 使用顺序队列取出队头元素所花费的时间复杂度为O&#xff08;N&#xff09;&#xff0c;把后面的元素向前移动一个下标所花…

CentOS Linux的最佳替代方案(二)_AlmaLinux OS 8.6基础安装教程

文章目录 CentOS Linux的最佳替代方案&#xff08;二&#xff09;_AlmaLinux OS 8.6基础安装教程一 AlmaLinux介绍和发展历史二 AlmaLinux基础安装2.1 下载地址2.2 安装过程 三 AlmaLinux使用3.1 关闭selinux/firewalld3.2 替换默认源3.3 安装一些必要工具 CentOS Linux的最佳替…

瓶盖扫码回收APP系统 废旧物品创造价值收益

资源回收再利用是近些年国家大力倡导的&#xff0c;人们也在积极践行&#xff0c;从垃圾回收、废旧衣物回收、烟盒回收等等.....今天小白要带大家了解的是瓶盖回收APP软件开发的相关事项。瓶盖回收APP是本着资源回收的初衷&#xff0c;可以时间废旧瓶盖的多次利用&#xff0c;减…

使用Xshell服务器跑程序,用pycharm连接服务器远程开发

目标&#xff1a; 1.使用Xshell在服务器上创建自己项目需要的虚拟环境 2.用pycharm实现远程服务器的连接&#xff08;这样就可以在本地debug或者写代码&#xff0c;然后再用xshell在服务器上跑&#xff09; 一、使用Xshell在服务器上创建自己项目需要的虚拟环境 1.打开Xshe…

工具系列之wireshark使用说明

简介 工具下载&#xff1a; https://www.wireshark.org/官方FAQ: https://www.wireshark.org/faq.html 过滤器设置 通常情况下&#xff0c;将.pcap 数据拖拽至 wireshark中即可打开。通过&#xff1a; 导航栏–》分析 --> 显示过滤器 即可找到对应的筛选器&#xff0c;筛…

美格智能发布高性价比5G RedCap CPE解决方案SRT835,加速5G FWA商业落地

6月30日&#xff0c;在MWC 2023上海5G未来峰会上&#xff0c;美格智能重磅发布高性价比轻量化5G RedCap&#xff08;也称作NR-Light&#xff09;CPE解决方案SRT835。该方案搭载骁龙X35调制解调器及射频系统和WCN6856高速Wi-Fi 6解决方案&#xff0c;通过精简系统架构&#xff0…

【技术教程】H.265网页流媒体播放器EasyPlayer无感知播放体验优化

EasyPlayer是我们流媒体组件系列中关注度较高的产品&#xff0c;经过多年的发展和迭代&#xff0c;目前已经有多个应用版本&#xff0c;包括RTSP版、RTMP版、Pro版&#xff0c;以及js版&#xff0c;其中js版本作为网页播放器&#xff0c;受到了用户的广泛使用。 目前我们所有的…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第十天 10/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

初探 C++ 标准库

有趣的重载 重载左移操作符&#xff0c;将变量或常量左移到一个对象中&#xff01; C 标准库 C 标准库并不是 C 语言的一部分 C 标准库是由类库和函数库组成的集合 C 标准库中定义的类和对象都位于 std 命名空间中 C 标准库的头文件都不带 .h 后缀 C 标准库涵盖了 C 库的功…

优思学院|什么是六西格玛黑带?

六西格玛黑带&#xff0c;这是一个有趣的称谓。这个称号意味着拥有它的人在六西格玛方法和统计工具应用方面有很高的造诣。在企业中&#xff0c;只有中层以上的人才能获得这个称号。 黑带这个词源自跆拳道&#xff0c;因为跆拳道最高段位的人所戴的腰带是黑色的。后来&#xf…

『赠书活动 | 第十三期』《算力经济:从超级计算到云计算》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十三期』 本期书籍&#xff1a;《算力经济&#xff1a;从超级计算到云计算》 赠书规则&#xff1a;评论区&#xff1a;点赞&#xff5c;收…

多个el-checkbox-group复选框组 选项互斥

需求 多个el-checkbox-group复选框组 , 组与组之间的选项是互斥的效果效果 代码实现 template <template><div class"page"><el-checkbox-groupv-for"(item, index) in list"v-model"item.checked":key"index"chan…

网络投票链接的制作方法投票制作方法微网络投票

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…

docker-compose部署Minio

一、镜像选择 Minio有很多镜像会有一些bug&#xff0c;而且不好解决&#xff0c;这里使用的是镜像 RELEASE.2021-04-18T19-26-29Z 直接: docker pull minio/minio:RELEASE.2021-04-18T19-26-29Z 即可&#xff1a; 拉取之后可以打个tag&#xff0c;这里是new2 RELEASE.2021…

在chrome-console中进行xpath/css/js定位(六)

目录 1.xpath 1.1 绝对定位与相对定位 1.2 通配符与不包含筛选 1.3 Xpath函数运算的简单实用 1.4 各种亲戚标签的定位 1.5xpath实例 1.5.1xpath:属性定位 1.5.2xpath:其它属性 1.5.3xpath:标签 1.5.4xpath:层级 1.5.5xpath:索引 1.5.6xpath:逻辑运算 1.5.7xpath:模…

界面组件DevExpress WPF v23.1新版亮点 - 启动和内存优化

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

智能机井灌溉控制器批量应用于新疆农业灌溉计量监测项目

近日&#xff0c;新疆某县级水利部门为进一步提升水资源取用水的监管能力&#xff0c;完善水资源实时监控、计划用水和节约用水管理目标&#xff0c;对该地农业灌溉用水计量设施进行升级改造&#xff0c;将700口井安装智能机井灌溉控制器&#xff0c;有效实现水量监测&#xff…