8644 堆排序

news2024/10/4 8:14:57

### 思路
堆排序是一种基于堆数据结构的排序算法。堆是一种完全二叉树,分为最大堆和最小堆。堆排序的基本思想是将待排序数组构造成一个最大堆,然后依次将堆顶元素与末尾元素交换,并调整堆结构,直到排序完成。

### 伪代码
1. 读取输入的待排序关键字个数`n`。
2. 读取`n`个待排序关键字并存储在数组中。
3. 构建最大堆。
4. 输出初始建堆后的结果。
5. 依次将堆顶元素与末尾元素交换,并调整堆结构。
6. 每次交换后输出当前排序结果。
7. 重复步骤5直到排序完成。

### C++代码
 

#include <iostream>
#include <vector>
using namespace std;

void printArray(const vector<int>& arr) {
    for (size_t i = 0; i < arr.size(); ++i) {
        if (i > 0) cout << " ";
        cout << arr[i];
    }
    cout << endl;
}

void heapify(vector<int>& arr, int n, int i) {
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;

    if (left < n && arr[left] > arr[largest])
        largest = left;

    if (right < n && arr[right] > arr[largest])
        largest = right;

    if (largest != i) {
        swap(arr[i], arr[largest]);
        heapify(arr, n, largest);
    }
}

void heapSort(vector<int>& arr) {
    int n = arr.size();

    // Build max heap
    for (int i = n / 2 - 1; i >= 0; --i)
        heapify(arr, n, i);

    // Output initial heap
    printArray(arr);

    // One by one extract elements from heap
    for (int i = n - 1; i > 0; --i) {
        swap(arr[0], arr[i]);
        heapify(arr, i, 0);
        printArray(arr); // Output current state after each swap and heapify
    }
}

int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; ++i) {
        cin >> arr[i];
    }

    heapSort(arr);

    return 0;
}

### 总结
堆排序通过构建最大堆,然后依次将堆顶元素与末尾元素交换,并调整堆结构来进行排序。每次交换后输出当前排序结果。

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

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

相关文章

自闭症干预寄宿学校:专业治疗帮助孩子发展

自闭症干预寄宿学校&#xff1a;星贝育园的专业治疗助力孩子全面发展 在自闭症儿童的教育与康复领域&#xff0c;寄宿学校以其独特的教育模式和全面的关怀体系&#xff0c;为众多家庭提供了重要的选择。广州星贝育园自闭症儿童寄宿制学校&#xff0c;作为这一领域的佼佼者&…

达梦core文件分析(学习笔记)

目录 1、core 文件生成 1.1 前置条件说明 1.2 关于 core 文件生成路径的说明 1.3查看 core 文件的前置条件 2、查看 core 文件堆栈信息 2.1 使用gdb 2.2 使用达梦dmrdc 3、core 分析过程 3.1 服务端主动 core 3.2因未知异常原因导致的 core 4、测试案例 4.1测试环境…

(十八)、登陆 k8s 的 kubernetes-dashboard 更多可视化工具

文章目录 1、回顾 k8s 的安装2、确认 k8s 运行状态3、通过 token 登陆3.1、使用现有的用户登陆3.2、新加用户登陆 4、k8s 可视化工具 1、回顾 k8s 的安装 Mac 安装k8s 2、确认 k8s 运行状态 kubectl proxy kubectl cluster-info kubectl get pods -n kubernetes-dashboard3、…

网页前端开发之Javascript入门篇(4/9):循环控制

Javascript循环控制 什么是循环控制&#xff1f; 答&#xff1a;其概念跟 Python教程 介绍的一样&#xff0c;只是语法上有所变化。 参考流程图如下&#xff1a; 其对应语法&#xff1a; var i 0; // 设置起始值 var minutes 15; // 设置结束值&#xff08;15分钟…

Stream流的终结方法(一)

1.Stream流的终结方法 2.forEach 对于forEach方法&#xff0c;用来遍历stream流中的所有数据 package com.njau.d10_my_stream;import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.function.Consumer; import java.util…

安全帽头盔检测数据集 3类 12000张 安全帽数据集 voc yolo

安全帽头盔检测数据集 3类 12000张 安全帽数据集 voc yolo 安全帽头盔检测数据集介绍 数据集名称 安全帽头盔检测数据集 (Safety Helmet and Person Detection Dataset) 数据集概述 该数据集专为训练和评估基于YOLO系列目标检测模型&#xff08;包括YOLOv5、YOLOv6、YOLOv7…

SpringCloud入门(十一)路由过滤器和路由断言工厂

一、路由过滤器 路由过滤器&#xff08; GatewayFilter &#xff09;是网关中提供的一种过滤器&#xff0c;可以对进入网关的请求和微服务返回的响应做处理&#xff1a; 如图&#xff1a;网关路由过滤器&#xff1a; 路由过滤器的作用是&#xff1a; 1.对路由的请求或响应做加…

第二十章(自定义类型,联合和枚举)

1. 联合体类型的声明 2. 联合体的特点 3. 联合体⼤⼩的计算 4. 枚举类型的声明 5. 枚举类型的优点 6. 枚举类型的使⽤ 光阴如骏马加鞭一、联合体 概念&#xff1a;像结构体一样&#xff0c;联合体也是由一个或者多个成员组成的&#xff0c;这些成员也可以是不同的类型。 …

JavaSE篇:文件IO

一 认识文件 在硬盘这种持久化存储的I/O设备或其他存储介质中 &#xff0c;当我们想要进行数据保存时&#xff0c;往往不是保存成⼀个整体&#xff0c;⽽是独⽴成⼀个个的单位进⾏保存&#xff0c;这个独⽴的单位就被抽象成⽂件的概念。就类似办公桌上的⼀份份真实的⽂件⼀般。…

疾风气象大模型如何预测气象数据,预测数据怎么获得

随着科技的快速发展&#xff0c;人工智能和大数据技术逐渐渗透到各个领域&#xff0c;气象预测也不例外。过去&#xff0c;气象预测主要依赖于物理模型&#xff0c;结合大气、海洋、陆地等系统的观测数据&#xff0c;通过复杂的数值计算来推测未来天气。而如今&#xff0c;大模…

八、跳跃、闪避

一、人物跳跃功能 1、动画 设置一个bool值 条件设置为true 2、逻辑 实现跳跃&#xff0c;一定有IsGround&#xff1b;判断是否为地面&#xff0c;进行跳跃功能 写一个跳跃和一个条约结束方法 跳跃设置为false&#xff0c;结束设置为true 3、代码 public void Jump() {if…

Ray_Tracing_In_One_Weekend下

1Lambertian漫反射材质 一个物体的材质&#xff0c;可以分成两部分来看&#xff0c;因为物体没有绝对光滑和绝对粗糙 漫反射&#xff1a;由于物体粗糙&#xff0c;那么对于微小平面&#xff0c;光线会向四周反射&#xff0c;光源的一部分光线传回人眼 镜面反射&#xff1a;假…

C++ 类和对象的初步介绍

文章目录 1.面向过程和面向对象的初步认识2.类的引入3.类的定义4. 类的访问限定符及封装4.1 访问限定符4.2 封装 5.类的作用域6.类的实例化 1.面向过程和面向对象的初步认识 C语言是面向过程的&#xff0c;关注的过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用…

OpenCV Canny()函数

OpenCV Canny()函数被用来检测图像物体的边缘。其算法原理如下&#xff1a; 高斯滤波&#xff1a;使用高斯滤波器平滑图像以减少噪声。高斯滤波器是一种线性滤波器&#xff0c;可以消除图像中的高频噪声&#xff0c;同时保留边缘信息。计算梯度强度和方向&#xff1a;使用Sobe…

教资备考--高中数学(仅为高中数学梳理)

按照高中学习数学梳理的方案进行整理

爬虫——同步与异步加载

一、同步加载 同步模式--阻塞模式&#xff08;就是会阻止你浏览器的一个后续加载&#xff09;停止了后续的解析 因此停止了后续的文件加载&#xff08;图像&#xff09; 比如hifini音乐网站 二、异步加载 异步加载--xhr(重点) 比如腾讯新闻&#xff0c;腾讯招聘等 三、同…

组合框QGroupBox设置checked属性

我们可以给组合框设置checked属性 //获取和设置checked属性是否开启 bool isCheckable() const void setCheckable(bool checkable)//获取和设置选中还是非选中 bool isChecked() const void setChecked(bool checked)效果如下&#xff1a; 如果checked属性使能之后&#xff0…

Open3D实现点云数据的序列化与网络传输

转载自个人博客&#xff1a;Open3D实现点云数据的序列化与网络传输 在处理点云数据的时候&#xff0c;有时候需要实现点云数据的远程传输。当然可以利用传输文件的方法直接把点云数据序列化成数据流进行传输&#xff0c;但Open3D源码在实现RPC功能时就提供了一套序列化及传输的…

用langchain+streamlit应用RAG实现个人知识库助手搭建

RAG原理概述 RAG&#xff08;Retrieval-Augmented Generation&#xff09; 是一种结合了信息检索和生成式人工智能技术的模型架构&#xff0c;旨在让模型生成更有根据和更准确的回答。通俗来讲&#xff0c;它让模型不只是凭借自己的“记忆”&#xff08;预训练数据&#xff09…

Java中的依赖注入(Dependency Injection, DI)详解

Java中的依赖注入&#xff08;Dependency Injection, DI&#xff09;是软件工程中的一种重要设计模式。它有助于提高系统的可测试性、可维护性和灵活性。通过依赖注入&#xff0c;组件不再负责创建它们所需的对象&#xff0c;而是通过外部的设置来提供这些对象。这种方式也与控…