【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】

2023-11-05

目录

前言

1.直接选择排序

1.1基本思想

1.2直接选择排序实现过程

1.3动图助解

1.4直接选择排序源码

2.堆排序

2.1堆排序的概念

2.2堆排序源码 


前言

选择排序有两种常见的【直接选择排序】、【堆排序】


1.直接选择排序

1.1基本思想

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
进阶思想:在遍历一遍后,我们不仅可以选出最小的数,还可以把最大的数选出来

1.2直接选择排序实现过程

①:在元素集合 array[i]--array[n-1] 中选择关键码最大 ( ) 的数据元素
②:若它不是这组元素中的最后一个 ( 第一个 ) 元素,则将它与这组元素中的最后一个(第一           个)元素交换
③:在剩余的 array[i]--array[n-2] array[i+1]--array[n-1] )集合中,重复上述步骤,直到集合         剩余 1 个元素

1.3动图助解

选择排序


1.4直接选择排序源码

void SelectSort(int* a, int n)
{
	assert(a);
	int begin = 0, end = n - 1;
	while (begin < end)
	{
		int mini = begin, maxi = begin;
		for (int i = begin + 1; i <= end; ++i)
		{
			if (a[i] < a[mini])
				mini = i;

			if (a[i] > a[maxi])
				maxi = i;
		}
		Swap(&a[begin], &a[mini]);

		// 如果begin和maxi重叠,那么要修正一下maxi的位置
		if (begin == maxi)//如果走了这一步代表第一个数就是最大的
		{
			maxi = mini;
		}

		Swap(&a[end], &a[maxi]);
		++begin;
		--end;
	}
}

1.5直接选择排序的特性总结

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


2.堆排序

2.1堆排序的概念

堆排序 (Heapsort) 是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。
需要注意的是排升序要建大堆,排降序建小堆。

为什么建大堆呢?

建大堆,堆顶元素是最大的数,让堆顶元素和最后一个元素交换,再向下调整,注意:这里向下调整时是调整的数组大小-1个,也就是调整刚刚交换下来前面的数据

2.2堆排序源码 

void HeapSort(int* a, int n)
{
 
	// 建堆方式2:O(N)
	for (int i = (n-1-1)/2; i >= 0; --i)
	{
		AdjustDwon(a, n, i);
	}
 
	// O(N*logN)
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);//这里的end是9,传过去向下调整的元素个数也是9,
                             //就不会调整刚刚从堆顶传下来的数据
		AdjustDwon(a, end, 0);
		--end;
	}
因为之前学习二叉树的时候学习了堆的相关知识,如果想进一步学习堆排序的话,可以去看看小余之前写的博客哦,链接如下:【点击就会跳转】
深入浅出堆—C语言版【数据结构】_小余大牛成长记的博客-CSDN博客

下一篇就是交换排序了哦【冒泡排序】、【快速排序】


如果觉得文章不错,期待你的一键三连哦,你个鼓励是我创作的动力之源,让我们一起加油,顶峰相见!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】 的相关文章

随机推荐

  • vbs 文件用于删除符合条件的文件夹

    数据库备份后的文件夹名称为 2011 06 30 2011 07 01 2011 07 02 2011 07 03 2011 07 04 2011 07 05 文件夹内为数据库的备份文件 现考虑只保存最后两天的文件夹 因此 做了一个定时任务
  • go 进阶 RPC相关: 一. RPC 与 Protobuf 基础问题

    目录 一 什么是RPC 1 RPC 实现原理 2 有http为什么还要出现RPC 3 Protobut Protobuf 编码方式 Protobuf 数据存储方式 Protobuf对于数据存储的三大原则 Protobuf 序列化原理 4 其
  • GBDT浅谈以及代码实现

    GBDT作为近年很热门的模型 其性能非常突出 用途也是涵盖了从特征选择到分类 回归 被广大从业者和爱好者所使用 网上关于gbdt的原理和数学推导已经有很多 我就谈谈我个人的浅见 如有错误还望指正 同时还附上我自己实现的简单的python代码
  • MSP430 LCD控制器解释

    CC430F613x的LCD控制器最多能控制160段 The LCD B controller features are Display memory Automatic signal generation Configurable fra
  • 关于微信开发的 appid,openid,unionid

    1 appid 公众号的唯一标识 注册即分配 可在公众号后台查询 用来进行公众号 小程序等的各种交互功能 2 openid 用户的唯一标识 加密后的微信号 对同一公众号 openid唯一 但对于不同公众号 openid不同 用户在关注公众号
  • nn.Sequential和nn.Module区别与选择

    一 nn Sequential torch nn Sequential是一个Sequential容器 模块将按照构造函数中传递的顺序添加到模块中 另外 也可以传入一个有序模块 为了更容易理解 官方给出了一些案例 Sequential使用实例
  • SDUT 2022 Winter Individual Contest - E ( H - Perfect Ban )

    题目链接 题意 就是在一个矩阵中删去一行和一列 使得剩余的值最小 题解 首先我们先意识到的是本题应该是没有重复的数的 虽然题目中好像没有说明 但是看了很多的题解好像都没有考虑 然后就是找到最大值和次大值 这里最大值是确定的 但是次大值是不确
  • 论文阅读——Bridging Global Context Interactions for High-Fidelity Image Completion

    2022 CVPR 2022 Bridging Global Context Interactions for High Fidelity Image Completion pdf code 本文创新点 在粗修复阶段 提出限制性卷积块 Re
  • File转base64的封装(回调函数形式),以及如何通过base64判断数据源的类型

    最近的task都是文件流的上传下载各种转 主要是涉及File转base64 简要思路就是 FileReader读取文件 通过readAsURL方法 获得一个base64类型的流 看了看网上别人的封装 File转base64 param fi
  • Mybatis动态sql深度剖析

    转自 Mybatis动态sql深度剖析 下文笔者将带领您一步一步的进入Mybatis动态sql的世界 如下所示 mybatis动态sql 动态sql 就是可以变化的sql Mybatis可根据OGNL表达式 一步一步的生成sql语句 myb
  • 【华为OD机试真题 C++】硬件产品销售方案

    前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun09
  • '' is not defined js传递的参数未定义

    jsp页面代码 td style font weight blod text align center width 150px a span style color blue 删除 span a td js代码 function delet
  • ubuntu 安装 cuda10.2 8.0 及 cuBLAS

    Ubuntu 18 04安装 cuda10 2 安装显卡驱动 Install NVIDIA driver sudo apt get install no install recommends nvidia driver 430 Reboot
  • ChatGPT开源吗

    作为一个由OpenAI开发的AI模型 ChatGPT的源代码并没有完全开源 OpenAI提供了API 以让开发者在他们的应用程序中使用ChatGPT的能力 但是源代码并没有公开发布 然而 OpenAI开源了一个与GPT 2相似的模型 称为G
  • 使用Python究竟可以做什么?下面是Python的3个主要应用

    前言 如果您正在考虑学习Python 或者您最近才开始学习 您可能会问自己 我用Python到底能做什么 这个问题很难回答 因为Python有很多应用程序 但随着时间的推移 我发现Python有3种主要的流行应用 Web开发 数据科学 包括
  • 原生js——实现ios辅助触控的悬浮球案例

    用过iphone的都知道 ios系统有一个重要的功能 辅助触控 可以让我们在触摸屏幕有困难或需要自适应配件的情况下使用iphone 辅助触控中 悬浮球充当着重要角色 它置顶悬浮在屏幕边缘 可任意移动 既不影响用户正常操作系统 又能提供许多功
  • 以太坊生产网络/测试网络/私有网络

    要理解以太坊 PrivateNetwork 先要理解以太坊的两种官方网络 目前以太坊官方提供了两种网络 生产环境网络 测试网络 TestNet 下面将分别简单讲解下这两种网络 以太坊生产网络 以太坊的生产网络顾名思义 也就是产生真正有价值的
  • SpringBoot 封装Windows 性能监控

    整体项目结构 BlueSky 的pom xml 文件
  • 华为OD机试 - 观看文艺汇演问题(JS)

    题目描述 为了庆祝中国共产党成立100周年 某公园将举行多场文艺表演 很多演出都是同时进行 一个人只能同时观看一场演出 且不能迟到早退 由于演出分布在不同的演出场地 所以连续观看的演出最少有15分钟的时间间隔 小明是一个狂热的文艺迷 想观看
  • 【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】

    目录 前言 1 直接选择排序 1 1基本思想 1 2直接选择排序实现过程 1 3动图助解 1 4直接选择排序源码 2 堆排序 2 1堆排序的概念 2 2堆排序源码 前言 选择排序有两种常见的 直接选择排序 堆排序 1 直接选择排序 1 1基