堆排序【东北大学oj数据结构9-4】C++

server/2024/12/19 17:38:46/

堆排序是一种基于堆的数据结构的排序,是一种快速排序算法,可以在输入数组中实现排序处理(内存高效)。 堆排序可以实现如下:

maxHeapify(A, i)
    l = left(i)
    r = right(i)
    // select the node which has the maximum value
    if l ≤ heapSize and A[l] > A[i]
        largest = l
    else 
        largest = i
    if r ≤ heapSize and A[r] > A[largest]
        largest = r
        
    if largest ≠ i 
        swap A[i] and A[largest]
        maxHeapify(A, largest) 

heapSort(A):
    // buildMaxHeap
    for i = N/2 downto 1:
        maxHeapify(A, i)
    // sort
    heapSize ← N
    while heapSize ≥ 2:
        swap(A[1], A[heapSize])
        heapSize--
        maxHeapify(A, 1)

另一方面,堆排序频繁地交换远处的元素,导致对非连续元素的大量随机访问。

现在给你 N 个元素的序列 A,你要找到它的一个排列,使得它是一个最大堆,且当把它变成排好序的序列时,伪代码第25行的maxHeapify中交换的总次数尽可能最大。

输入

第一行给出了整数 N,它表示序列的长度。
在第二行,给出了 N 个整数,用空格分隔。
1 ≤ N ≤ 200000
0 ≤ A ≤ 1000000000
A的所有元素都不同

输出

在一行输出满足条件的序列。 请输出以一个空格分隔的序列的连续元素。

对于一个输入,这个问题有多个答案。 所有满足条件的输出都是正确的。

输入样例

8
1 2 3 5 9 12 15 23

输出样例

23 9 15 2 5 3 12 1 

代码

下面的代码不完全按照题干伪代码排序

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// Function to reconstruct the max heap
void buildMaxHeap(vector<int>& A) {int n = A.size();for (int i = n / 2 - 1; i >= 0; i--) {int largest = i;int l = 2 * i + 1;int r = 2 * i + 2;if (l < n && A[l] > A[largest]) {largest = l;}if (r < n && A[r] > A[largest]) {largest = r;}if (largest != i) {swap(A[i], A[largest]);i=largest+1;//restart from the updated node to make sure all changes reflectedif (i<=n/2-1){i--;}else {i=-1;}}}
}int main() {int n;cin >> n;vector<int> A(n);for (int i = 0; i < n; i++) {cin >> A[i];}sort(A.begin(),A.end(),greater<int>());buildMaxHeap(A);for (int i = 0; i < n; i++) {cout << A[i] << (i == n - 1 ? "" : " ");}cout << endl;return 0;
}

http://www.ppmy.cn/server/151496.html

相关文章

MySQL EXPLAIN 详解:一眼看懂查询计划

在日常的数据库开发中&#xff0c;我们经常需要分析 SQL 查询性能&#xff0c;而 EXPLAIN 是 MySQL 提供的利器&#xff0c;可以帮我们快速理解查询计划&#xff0c;优化慢查询。本文将详细解析 EXPLAIN 的输出字段及其含义&#xff0c;并结合实际案例分享优化思路。 一、什么是…

vue计时器

实现一个倒计时功能用于下单后的计时 代码 倒计时组件 import { ref, onUnmounted } from vue import { computed } from vue import dayjs from dayjsexport const useCountDown () > {// 响应式数据let timer nullconst time ref(0)// 格式化为时分秒const formatTi…

Go 错误处理

Go 错误处理 Go 语言在设计时考虑了错误处理的重要性&#xff0c;提供了一套简洁而强大的错误处理机制。本文将深入探讨 Go 中的错误处理方式&#xff0c;包括错误类型的定义、错误处理的基本模式、以及最佳实践。 错误类型定义 在 Go 中&#xff0c;错误是一个接口&#xf…

C#多线程

C#中的多线程编程是开发高效并发应用程序的关键技术之一&#xff0c;它允许程序同时执行多个任务&#xff0c;从而提升应用程序的响应速度和性能。为了更好地理解C#中的多线程使用和定义&#xff0c;我们可以从以下几个方面来探讨&#xff1a;线程的基本概念、创建线程的方法、…

之前使用vue-element-admin框架开发的项目无法启动,可能是这个原因

最近运行之前的项目&#xff0c;发现无法正常启动&#xff0c;可能有以下几种情况&#xff1a; 一、版本问题 报错&#xff1a; this[kHandle] new _Hash(algorithm, xofLen); Error: error:0308010C:digital 因为在 node V17 版本发布了 OpenSSL3.0 对算法…

单例模式的简单应用

单例模式主要是为了确保只有单个对象被创建&#xff0c;主要解决一个类的对象频繁地创建与销毁 我们通过如下示例来了解单例模式的作用&#xff0c;以及实现方案 如上图&#xff0c;我们只要点击一次"普通模式"的菜单&#xff0c;即会创建一个新的窗体对象。 而我们…

C++ 的衰退复制(decay-copy)

目录 1.什么是衰退复制&#xff08;decay-copy&#xff09; 1.1.推导规则 1.2.LWG issue 929 1.3.想象中的 decay_copy 2.decay-copy 与 auto 2.1.为什么引入衰退复制 2.2. 成为 C 23 的语言特性 3.应用场景 4.总结 1.什么是衰退复制&#xff08;decay-copy&#xff0…

如何理解OSI七层模型?从是什么、如何划分、传输过程是什么?

目录 OSI七层模型概述 1.1 什么是OSI七层模型1.2 OSI七层模型的七个层级1.3 OSI七层模型的作用OSI七层模型的具体划分 2.1 应用层(Application Layer)2.2 表示层(Presentation Layer)2.3 会话层(Session Layer)2.4 传输层(Transport Layer)2.5 网络层(Network Layer)…