当前位置: 首页 > article >正文

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

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

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 reflected
             if (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.kler.cn/a/447438.html

相关文章:

  • 从监控异常发现网络安全
  • VS Code Copilot 与 Cursor 对比
  • Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • 二八(vue2-04)、scoped、data函数、父子通信、props校验、非父子通信(EventBus、provideinject)、v-model进阶
  • 纯前端实现更新检测
  • 【Axure高保真原型】伸缩表单
  • ELK系列-(六)Redis也能作为消息队列?(下)
  • 用Python设置Excel工作表的页眉和页脚
  • Python解决安装包报错4.0.0-unsupported
  • 使用支持向量机(SVM)实现二分类
  • 数据倾斜的原因以及解决方法
  • SQL注入(SQL lnjection Base)21
  • 数据结构_平衡二叉树
  • 前端面试题整理-前端异步编程
  • 【Token】校验、会话技术、登录请求、拦截器【期末实训】实战项目学生和班级管理系统\Day15-后端Web实战(登录认证)\讲义
  • ip_forward函数
  • gesp(二级)(7)洛谷:B3865:[GESP202309 二级] 小杨的 X 字矩阵
  • STM32-笔记7-继电器定时开闭
  • 雅思真题短语梳理(八)
  • 常用的JVM启动参数有哪些?
  • 电子发票汇总改名,批量处理电子发票问题
  • ChatGPT接口测试用例生成的流程
  • windows安装Elasticsearch及增删改查操作
  • 基于SpringBoot+Mysql实现的在线音乐系统平台功能实现一
  • postman测试导入文件
  • 【ETCD】【实操篇(四)】etcd常见问题快问快答FAQ