【数据结构/排序】堆排序C++代码模板

堆排序C++代码模板

image

// 下沉调整函数
void sift_down(vector<int>& arr, int i, int n) {
    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]);
        sift_down(arr, largest, n);
    }
}

// 堆排序主函数
void heap_sort(vector<int>& arr) {
    int n = arr.size();

    // 构建初始最大堆(从最后一个非叶子节点开始调整)
    for (int i = n / 2 - 1; i >= 0; i--) {
        sift_down(arr, i, n);
    }

    // 逐个将堆顶元素(最大值)交换到末尾,并调整堆
    for (int i = n - 1; i > 0; i--) {
        swap(arr[0], arr[i]);      // 将堆顶元素移到末尾
        sift_down(arr, 0, i);      // 调整剩余元素为最大堆
    }
}

下沉调整函数迭代写法

// 下沉调整函数
void sift_down(vector<int>& arr, int i, int n) {
    while (i < n) {
        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) break;

        // 否则交换,并继续向下调整
        swap(arr[i], arr[largest]);
        i = largest;
    }
}

image

模板题 P1177 【模板】排序

// Problem: P1177 【模板】排序
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1177
// Memory Limit: 256 MB
// Time Limit: 1000 ms

#include <iostream>
#include <vector>

using namespace std;

// 下沉调整函数
void sift_down(vector<int>& arr, int i, int n) {
    while (i < n) {
        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) break;

        // 否则交换,并继续向下调整
        swap(arr[i], arr[largest]);
        i = largest;
    }
}

// 堆排序主函数
void heap_sort(vector<int>& arr) {
    int n = arr.size();

    // 构建初始最大堆(从最后一个非叶子节点开始调整)
    for (int i = n / 2 - 1; i >= 0; i--) {
        sift_down(arr, i, n);
    }

    // 逐个将堆顶元素(最大值)交换到末尾,并调整堆
    for (int i = n - 1; i > 0; i--) {
        swap(arr[0], arr[i]);      // 将堆顶元素移到末尾
        sift_down(arr, 0, i);      // 调整剩余元素为最大堆
    }
}

void solve() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) cin >> a[i];
    heap_sort(a);
    for (int& x : a) {
        cout << x << ' ';
    }
}

int main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int T = 1;
    while (T--) solve();
    return 0;
}
posted @ 2025-03-25 19:43  Tshaxz  阅读(45)  评论(0)    收藏  举报
Language: HTML