0
点赞
收藏
分享

微信扫一扫

堆排序(c++代码)

楚木巽 2022-03-12 阅读 33

堆排序

原理

知乎堆构建图解
十大经典排序算法

代码

#include <iostream>

using namespace std;

void heapSort(int *arr, int size) {
    //交换函数
    auto swap = [](int &a, int &b) {
        int t = a;
        a = b;
        b = t;
    };
    //左节点,(根节点为0)
    auto left = [](int cur) {
        return cur * 2 + 1;
    };
    //右节点
    auto right = [](int cur) {
        return cur * 2 + 2;
    };
    //自上往下调整
    auto heapify = [left, right, swap](int *arr, int cur, int size) {
        while (true) {
            int l = left(cur), r = right(cur);
            int maxId = cur;
            if (l < size && arr[l] > arr[maxId])maxId = l;
            if (r < size && arr[r] > arr[maxId])maxId = r;
            if (maxId == cur)break;
            else {
                swap(arr[maxId], arr[cur]);
                cur = maxId;
            }
        }
    };
    //建最大堆
    auto buildMaxHeap = [heapify](int *arr, int size) {
        for (int i = size / 2; i >= 0; i--) {
            //自下往上,每个节点自上往下调整。
            heapify(arr, i, size);
        }
    };
    buildMaxHeap(arr, size);
    //排序同时自根部往下调整最大堆
    for (int i = 0; i < size - 1; i++) {
        swap(arr[size - 1 - i], arr[0]);
        heapify(arr, 0, size - 1 - i);
    }
}

int main() {
    int size;
    cin >> size;
    int *arr = new int[size];
    for (int i = 0; i < size; i++)cin >> arr[i];
    heapSort(arr, size);
    for (int i = 0; i < size; i++)cout << arr[i] << " ";
    delete[] arr;
    /*
        5
        11 34 14 41 55
     */
    return 0;
}

举报

相关推荐

0 条评论