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

// 下沉调整函数
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;
}
}

模板题 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;
}

浙公网安备 33010602011771号