数据结构之堆排序

embedded/2025/1/23 16:28:32/

在这里插入图片描述


在这里插入图片描述


文章目录

  • 堆排序
    • 版本一
      • 图文理解
    • 版本二
      • 向下调整建堆
      • 向上调整建堆
    • 排升/降序
      • 升序

堆排序

版本一

  1. 基于已有数组建堆
  2. 取堆顶元素并删除堆顶元素重新建大根堆,完成排序版本。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

图文理解

在这里插入图片描述

版本二

前提:必须提供有现成的数据结构

数组建堆,首尾交换,交换后的堆尾数据从堆中删掉,将堆顶数据向下调整选出次大的数据。

向下调整建堆

  1. 先把每棵子树通过向下调整算法建成大根堆;
  2. 整体建成大根堆结构。
    在这里插入图片描述
	for (int i = (n - 1 - 1) / 2;i >= 0;i--){AdjustDown(arr, i, n);}
void AdjustDown(HPDataType* 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[parent] < arr[child]){Swap(&arr[parent], &arr[child]);parent = child;child = parent * 2 + 1;}else {break;}}
}

向上调整建堆

  1. 堆顶元素开始建堆;
  2. 通过将每一个结点进行建大根堆,最后整体就是大根堆结构。

通过顺序结构二叉树文章可知,向下调整算法的时间复杂度优于向上调整算法,因此更推荐用向下调整建堆

	for (int i = 0;i < n;i++){AdjustUp(arr, i);}
//向上调整
void AdjustUp(HPDataType* arr, int child)
{int parent = (child - 1) / 2;while (child > 0){//>:大堆//<:小堆if (arr[child] > arr[parent]){//交换Swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;}else {break;}}
}

在这里插入图片描述

排升/降序

排成升序结构,建大根堆;
排成降序结构,建小根堆。

升序

	int end = n - 1;while (end > 0){Swap(&arr[0], &arr[end]);AdjustDown(arr, 0, end);end--;}

注:当前是大根堆结构

  1. 堆顶数据与末端数据交换
  2. 重新建成大根堆结构保证下次取到的堆顶数据依然是最大值
  3. 最后数据将会排成升序结构。

在这里插入图片描述
那么,降序结构原理也类似上图所示。

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=8digt83n14t
在这里插入图片描述


在这里插入图片描述



http://www.ppmy.cn/embedded/156343.html

相关文章

【C++】在线五子棋对战项目网页版

目录 1.Websocket 1.1.Websocket的简单认识 1.2.什么是轮询呢&#xff1f; 1.3.websocket协议切换过程 1.4.websocketpp库常用接口认识 1.5.websocketpp库搭建服务器流程 1.6.websocketpp库搭建服务器 2.mysqlclient库-接口认识 3.项目模块的划分&#xff1a; 4.项目…

C语言——文件操作

目录 前言 一什么是文件 1程序文件 2数据文件 3文件名 二文件的打开与关闭 1文件指针 2fopen 3fclose 三文件的读与写 1文件的顺序读写 1.1fputc fgetc 1.2fputs fgets 1.3fprintf fscanf 1.4fwrite fread 1.5文本文件和二进制文件 2文件的任意读写 1fseek …

state的异步跟新

预测下刷新页面后&#xff0c;页面上会有啥数字出现 import React, { useState, useEffect } from "react";const Bpp () > {const [data, setData] useState([]);// const [loading, setLoading] useState(true);const [errorData, setErrorData] useState(…

窗口栏组件

在Qt中&#xff0c;窗口的布局可以由多个常用的部件组成。你提供的代码涉及了菜单栏、工具栏、状态栏、中心部件和铆接部件&#xff08;即停靠窗口&#xff09;。下面是每个部件的详细解析&#xff1a; 1. 菜单栏 (QMenuBar) Qt中的菜单栏用来创建应用程序的顶部菜单&#xf…

新能源监控平台都管理哪些数据

北理新源信息科技有限公司&#xff08;简称“北理新源”&#xff09;依托北京理工大学电动车辆国家工程研究中心&#xff0c;建设和运营了“新能源汽车国家监测与管理平台”。该平台是国家级的新能源汽车数据监管平台&#xff0c;主要负责对新能源汽车的运行数据进行采集、监测…

小米Vela操作系统开源:AIoT时代的全新引擎

小米近日正式开源了其物联网嵌入式软件平台——Vela操作系统&#xff0c;并将其命名为OpenVela。这一举动在AIoT&#xff08;人工智能物联网&#xff09;领域掀起了不小的波澜&#xff0c;也为开发者们提供了一个强大的AI代码生成器和开发平台。OpenVela项目源代码已托管至GitH…

Java设计模式 六 原型模式 (Prototype Pattern)

原型模式 (Prototype Pattern) 原型模式是一种创建型设计模式&#xff0c;通过复制现有对象来创建新对象&#xff0c;而不是直接实例化类。这种模式适用于创建成本较高的对象&#xff0c;或者需要重复创建相似对象的场景。 原型模式的核心思想是&#xff1a; 通过对象自身提供…

使用Redis防止重复发送RabbitMQ消息

问题 今天遇到一个问题&#xff0c;发送MQ消息的时候需要保证不会重复发送&#xff0c;注意不是可靠到达&#xff08;可靠到达可以通过消息确认机制和回调接口保证&#xff09;&#xff0c;这里保证的是不会生产多条一样的消息。 方法 综合讨论下来决定使用Redis缓存来解决&…