c语言堆排序(详解)

堆排序
堆排序是一种基于二叉堆数据结构的排序算法,它的基本概念包括:

  1. 建立堆:将待排序的列表构建成一个二叉堆,即满足堆的性质的完全二叉树,可以是最大堆或最小堆。最大堆要求父节点的值大于等于其子节点的值,最小堆则要求父节点的值小于等于其子节点的值。
  2. 堆调整:将堆顶元素(根节点)与最后一个元素交换,然后对剩余的n-1个元素重新调整成堆,此时堆顶元素为最大(或最小)元素。
  3. 重复堆调整:重复进行堆调整操作,每次将堆中最大(或最小)的元素放到列表的末尾,并将剩余元素重新调整成堆。
  4. 完成排序:当所有元素都已经被移出堆,列表就变成了一个有序序列。

堆排序的时间复杂度为O(nlogn),它是一种不稳定的排序算法。

完全二叉树是一种特殊的二叉树,它的基本概念包括:

  1. 完全二叉树是指除了最底层外,其他层的节点都是满的,并且最底层的节点都靠左排列。换句话说,如果用层次遍历的顺序来访问完全二叉树的节点,那么节点的顺序是从左到右依次排列的,不会出现空缺。
  2. 如果将完全二叉树的节点按从上到下、从左到右的顺序编号,那么对于任意一个节点i,如果其父节点存在,那么其父节点的编号为i/2;如果其左子节点存在,那么左子节点的编号为2i;如果其右子节点存在,那么右子节点的编号为2i+1。
  3. 完全二叉树通常使用数组来进行存储,而不是链式存储。这是因为完全二叉树的特性使得节点之间的关系可以通过数组的下标计算得出,节省了存储空间。

完全二叉树常常用于堆数据结构的实现,因为其特殊的性质使得堆操作更加高效

在这里插入图片描述堆排序cpp代码截图:

在这里插入图片描述堆排序cpp代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include <time.h>
#include <sys/timeb.h>
#define MAX 10
using namespace std;// 打印函数
void PrintArray(int arr[], int length) {for (int i = 0; i < length; i++) {cout << arr[i] << " ";}cout << endl;}
// 交换函数
void MySwap(int arr[], int a, int b) {int temp = arr[a];arr[a] = arr[b];arr[b] = temp;}/*@param myArr 待调整的数组@param index 待调整的节点下标@param len   数组的长度
*/
void HeapAdjust(int myArr[], int index, int len) {int max = index; // 保存当前节点的下标int lchild = index * 2 + 1;int rchild = index * 2 + 2;if (lchild < len && myArr[lchild] > myArr[max]) {max = lchild;}if (rchild < len && myArr[rchild] > myArr[max]) {max = rchild;}if (max != index) {//交换两个节点MySwap(myArr, max, index);HeapAdjust(myArr, max, len);}}
// 堆排序的代码
void HeapSort(int myArr[], int len) {// 初始化堆:大顶堆,从小到大for (int i = len / 2 - 1; i >= 0; i--) {HeapAdjust(myArr, i, len);}// 交换堆顶的元素和最后的元素for (int i = len - 1; i >= 0; i--) {MySwap(myArr, 0, i);HeapAdjust(myArr, 0, i);}
}
int main()
{int myArr[] = {4,2,8,0,5,7,1,3,9};int len = sizeof(myArr) / sizeof(myArr[0]);PrintArray(myArr, len);// 堆排序HeapSort(myArr, len);PrintArray(myArr, len);
}

堆排序运行结果展示:
在这里插入图片描述

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

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

相关文章

基于node 安装express后端脚手架

1.首先创建文件件 2.在文件夹内打开终端 npm init 3.安装express: npm install -g express-generator注意的地方&#xff1a;这个时候安装特别慢,最后导致不成功 解决方法&#xff1a;npm config set registry http://registry.npm.taobao.org/ 4.依次执行 npm install -g ex…

Qt之Ui样式表不影响子类的配置

Qt之Ui样式表不影响子类的配置 问题 在ui界面上布局时&#xff0c;当对容器进行样试设计时&#xff0c;会对容器内其它成员对象也进行了修改 分析 对应*.ui文件内容 从这个写法来看&#xff0c;它的样式属性会影响其成员对象样式属性。 解决方法 在容器的样式表中写时适…

如何将Galaxybase图数据库应用于电力设备管理

导读 近日&#xff0c;受强冷空气影响&#xff0c;部分北方地区出现不同程度的降雪&#xff0c;并持续降温。据国家电网发布的预警通知&#xff0c;要求启动预警响应和应急机制&#xff0c;密切跟踪灾害预警信息和应急响应情况&#xff0c;滚动研判分析覆冰、积雪、低温等对电…

beyond compare文件夹比较时候文本乱码问题解决

“格式”&#xff0c;在下面的左侧编码重写和右侧编码覆盖选择 GB2312/UTF-8/GBK&#xff0c;这个可以根据自己喜好和文本自身的encode选择。

跟着我学Python基础篇:08.集合和字典

往期文章 跟着我学Python基础篇&#xff1a;01.初露端倪 跟着我学Python基础篇&#xff1a;02.数字与字符串编程 跟着我学Python基础篇&#xff1a;03.选择结构 跟着我学Python基础篇&#xff1a;04.循环 跟着我学Python基础篇&#xff1a;05.函数 跟着我学Python基础篇&#…

从零构建属于自己的GPT系列6:模型部署2(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…

RocketMQ源码 Broker-ConsumerFilterManager 消费者数据过滤管理组件源码分析

前言 ConsumerFilterManager 继承了ConfigManager配置管理组件&#xff0c;拥有将内存数据持久化到磁盘文件consumerFilter.json的能力。它主要负责&#xff0c;对在消费者拉取消息时&#xff0c;进行消息数据过滤&#xff0c;且只针对使用表达式过滤的消费者有效。 源码版本&…

SPWM技术

一、基于数字正弦序列的数字SPWM 图1图中T0为正弦调制波周期&#xff1b;Ts为系统采样周期(即载波信号周期或逆变开关器件的开关频率周期)&#xff1b;N T0/Ts为载波比&#xff1b;Vdc为SPWM脉冲幅值&#xff1b;M≤1为脉宽调制比&#xff0c;其决定了信号最大脉冲宽度为MTs≤T…

信号继电器 DX-31B DC220V 电压型 带板前接线底座

系列型号 DX-31B信号继电器DX-31BJ信号继电器 DX-32A信号继电器DX-32AJ信号继电器 DX-32B信号继电器DX-32BJ信号继电器 DX-31A信号继电器DX-33/1信号继电器 DX-33/2信号继电器DX-33/3信号继电器 DX-33/4信号继电器DX-33/5信号继电器 一. 继电器用途 DX-30系列信号继电器…

Leetcode—1502.判断能否形成等差数列【简单】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—1502.判断能否形成等差数列 实现代码 class Solution { public:bool canMakeArithmeticProgression(vector<int>& arr) {sort(arr.begin(), arr.end());int diff abs(arr[1] - arr[0]);for(int i 1; i <…

Linux汇编语言编程-汇编语言

术语 Figure 3-13. 8086 Computer (Partial Model) reg 代表寄存器。 它可以是表 3.13 中列出的任何寄存器。 imm 代表立即数【immediate】&#xff08;可以理解为字面量&#xff0c;常量&#xff09;。 术语“立即数【immediate】”用于指代直接由十进制或十六进制表示形式给…

基于SSM的药房药品采购集中管理系统的设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对药房药品采购信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…

DevEco Studio 项目启动工程和Device Manage

DevEco Studio 项目启动工程和Device Manage 鸿蒙&#xff08;HarmonyOS&#xff09; 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、创建虚拟机&#xff08;Device Manage&#xff09; 鸿蒙IDE创建虚拟设备入口有2个地方&…

c⽂件操作

1.什么是⽂件&#xff1f; 磁盘上的⽂件是⽂件。但是在程序设计中&#xff0c;我们⼀般谈的⽂件有两种&#xff1a;程序⽂件、数据⽂件&#xff08;从⽂件功能的⻆度来分类的&#xff09;。 1.程序⽂件 程序⽂件包括源程序⽂件&#xff08;后缀为.c&#xff09;,⽬标⽂件&#…

操作系统笔记——概论、进程、线程(王道408)

文章目录 前言计算机系统概述OS的基本概念OS的发展历程OS的运行机制OS体系结构OS引导虚拟机 进程和线程进程和线程基础进程进程状态进程控制进程通信线程线程实现 CPU调度调度的层次进程调度细节调度算法评价指标批处理调度算法交互式调度方法 同步与互斥基本概念互斥互斥软件实…

shell实战-批量修改主机密码

1.编写执行脚本 vim host-pass.sh #!/bin/bash#配置旧的密码文件 cat >old_pass.txt <<EOF 10.36.192.182 root 123 22 10.36.192.184 root 123 22 EOF[ -f /etc/init.d/functions ] && . /etc/init.d/functions OLD_INFOold_pass.txt NEW_INFOnew_pass.txt…

设计模式(2)--对象创建(2)--生成器

1. 意图 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 2. 四种角色 指挥(Director)、抽象生成器(Builder)、具体生成器(Concrete Builder)、产品(Product) 3. 优点 3.1 可以改变一个产品的内部表示(通过定义新的生成器)。 3.2 将构…

云计算与AI融合:Amazon Connect开创客户服务智能时代

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 在亚马逊云科技 re:Invent 2023 大会上&#xff0c;Amazon Connect…

C/C++常见面试题(二)

接前面C/C常见面试题&#xff08;一&#xff09;&#xff0c;继续巩固 目录 1 sizeof和strlen的区别 2 宏定义的陷阱 3 不使用sizeof计算出类型或者变量所占的内存的字节数 4 给定一个数判断是否其是2的N次幂 5 C/C打印所在文件、行号、函数、日期&#xff0c;时间、遵循的…

力扣131. 分割回文串(java 回溯法)

Problem: 131. 分割回文串 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 题目要求我们给出所有的回文子字符串&#xff0c;而涉及到穷举我们可以利用回溯来解决&#xff0c;另外我们也可以发现问题中涉及到元素存在重复但不可复用的特性&#xff0c;因此我们可以类…