c语言堆排序(详解)

news2024/12/26 22:46:30

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

  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.coloradmin.cn/o/1310583.html

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

相关文章

Linux(21):软件安装 RPM,SRPM 与 YUM

软件管理员简介 以原始码的方式来安装软件&#xff0c;是利用厂商释出的Tarball来进行软件的安装。 不过&#xff0c;你每次安装软件都需要侦测操作系统与环境、设定编译参数、实际的编译、最后还要依据个人喜好的方式来安装软件到定位。这过程是真的很麻烦的。 如果厂商先在他…

FastAPI之表单数据

FastAPI 表单数据处理教程 FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;它用 Python 3.6类型提示的特性旨在方便和快速地设计和构建 APIs&#xff0c;并且减少代码的冗余与错误。下面将介绍如何在 FastAPI 中处理…

工业级路由器在风力发电场的远程监控技术

工业级路由器在风力发电场的远程监控技术方面具有重要的应用意义。风力发电场通常由分布在广阔地区的风力发电机组组成&#xff0c;需要进行实时监测、数据采集和远程管理。工业级路由器作为网络通信设备&#xff0c;能够提供稳定可靠的网络连接和多种远程管理功能&#xff0c;…

鸿蒙OS应用开发之登录界面

在前面学习了输入文本组件和按钮组件,可以使用这两种组件来实现一些常用的功能,比如登录界面,这种界面是每个程序员经常会到遇到的,比如让用户输入用户名称和密码。 在这里我们就来实现如下面的界面: 在上面界面里,第一个文本框用来输入用户名称,第二个用来输入用户密码…

python列表的循环遍历

数据容器&#xff1a;一个可以存储多个元素的Python数据类型 有哪些数据容器&#xff1a;list&#xff08;列表&#xff09;&#xff0c;tuple&#xff08;元组&#xff09;&#xff0c;str&#xff08;字符串&#xff09;&#xff0c;set&#xff08;集合&#xff09;&#x…

【STM32】ADC模数转换器

1 ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 STM32是数字电路&#xff0c;只有高低电平&#xff0c;没有几V电压的概念&#xff…

21. python __init__.py 文件的行为

重复打印行为分析 说明结论主模块主模块所在位置不会被python认为是包 说明 我在调试代码的时候&#xff0c;发现上面的print打印了两次&#xff0c;如果将图片中的 from aaa.F import Cat 改成 from F import Cat 则print只会打印一次。这是为什么呢&#xff1f; 结论 from …

华为海思、燧原、海光等齐力打破封锁,谁主AI芯片江山| 百能云芯

近期&#xff0c;美国对英伟达出口进行了限制&#xff0c;导致英伟达无法向中国大陆销售AI芯片&#xff0c;这一局势催生了中国本土IC设计企业的崛起&#xff0c;包括华为旗下的海思科技、腾讯旗下的燧原科技&#xff0c;以及海光信息和新创公司天数智芯等纷纷抢占市场。 据百能…

微信公众服务号升级订阅号

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;首先我们要知道服务号和订阅号有什么区别。服务号侧重于对用户进行服务&#xff0c;每月可推送4次&#xff0c;每次最多8篇文章&#xff0c;发送的消息直接显示在好友列表中。订阅号更侧重于信息传…

深度探索Linux操作系统 —— Linux图形原理探讨

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 深度探索Linux操作系统 —— 构建initramfs 深度探索Linux操作系统 —— 从内核空间到用户空间 深度探索Linux操作系统 —— 构建根文件系统…

基于SpringBoot+Thymeleaf+Mybatis学生信息管理系统(源码+数据库)

一、项目简介 本项目是一套基于SpringBootThymeleafMybatis学生信息管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试…

字符雨canvas

整体思路&#xff1a; 确定好字符雨的具体字符是什么&#xff0c;需要多少行多少列这里是写死的其实也可以用循环加随机的方式生成不一样的字符雨&#xff0c;行列也可以读一下宽度然后做一下出发算一下也行首先得有一张画布搞起&#xff0c;然后循环列数去绘画字符定时器循环…

SQL语句的执行顺序怎么理解?

SQL语句的执行顺序怎么理解&#xff1f; 我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别&#xff0c;对于编写高效、可靠的SQL代码至关重要。今天&#xff0c;让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。 一、书写顺序 VS 执行顺序 SQ…

数据结构和算法(全)

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…

后台业务管理系统原型模板,Axure后台组件库(整套后台管理页面)

后台业务系统需要产品经理超强的逻辑思维能力和业务理解能力&#xff0c;整理了一批后台原型组件及完整的用 Axure 8 制作的后台系统页面&#xff0c;方便产品经理们快速上手制作后台原型。 包括交互元件、首页、商品、订单、库存、用户、促销、运营、内容、统计、财务、设置、…

步进电机驱动芯片TB6600HG部分翻译

有些参数没看懂。一边设计&#xff0c;一边修正。 目录 1.芯片梗概 2.引脚配置 1)引脚含义 2)内部逻辑 3.功能详解 1&#xff09;励磁模式设置 2&#xff09;功能设置 3&#xff09;初始模式 4&#xff09;100% 电流设置(电流值) 5&#xff09;OSC 6&#xff09;衰减…

【unity】【WebRTC】从0开始创建一个Unity远程媒体流app-构建可同步场景

【背景】 最近在研究远程画面,所以就实践了一下。技术采用我认为比较合适的WebRTC。 这篇文章的基础是我的另一篇博文,如果希望顺利完成本篇操作,请先关注我后查询我的如下博文: 【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面 上一篇地址: 【WebRTC】【Uni…

【PWN】学习笔记(三)【返回导向编程】(中)

目录 课程回顾动态链接过程 课程 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 回顾 管道符 | 把前一个指令的输出作…

一文了解java中volatile关键字

认识volatile volatile关键字的作用有两个&#xff1a;变量修改对其他线程立即可见、禁止指令重排。 第二个作用我们后面再讲&#xff0c;先主要讲一下第一个作用。通俗点来说&#xff0c;就是我在一个线程对一个变量进行了修改&#xff0c;那么其他线程马上就可以知道我修改…

树莓派zero w入坑指南

树莓派zero w入坑指南 入坑契机 说起创客不得不提到开源硬件Raspberry Pi(树莓派)。它是一款基于ARM的微型电脑主板&#xff0c;以MicroSD卡为硬盘&#xff0c;提供HDMI和USB等外部接口&#xff0c;可连接显示器和键鼠。以上部件全部整合在一张仅比信用卡稍大的主板上&#x…