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

发布于:2024-12-19 ⋅ 阅读:(17) ⋅ 点赞:(0)

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

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;
}