#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000000+5;
int heap[maxn], n;
//对数组[low, high] 范围进行向下调整
void downAdjust(int low, int high) {
int i = low, j = i*2;
while (j <= high) {
//如果右孩子存在,
if (j + 1 <= high && heap[j + 1] > heap[j]) {
j = j + 1;
}
if (heap[j] > heap[i]) {
swap(heap[j], heap[i]);
i = j;
j = i * 2;
} else {
break;
}
}
}
//建大顶堆
void createHeap() {
for (int i = n/2; i >= 1; i--) {
downAdjust(i, n);
}
}
////对数组[low, high]范围内进行向上调整
//void upAdjust(int low, int high) {
// int i = high, j = i/2;
// while (j >= low) {
// if (heap[j] < heap[i]) {
// swap(heap[j], heap[i]);
// i = j;
// j = j/2;
// } else {
// break;
// }
// }
//}
////添加元素
//void insert(int x) {
// heap[++n] = x;
// upAdjust(1, n);
//}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> heap[i];
}
createHeap();
for (int i = n; i > 1; i--) {
swap(heap[i], heap[1]);
downAdjust(1, i-1);
}
for (int i = 1; i <= n; i++) {
if (i == 1) cout << heap[i];
else cout << " " << heap[i];
}
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000000+5;
int heap[maxn], n;
//对数组[low, high] 范围进行向下调整
void downAdjust(int low, int high) {
int i = low, j = i*2;
while (j <= high) {
//如果右孩子存在,
if (j + 1 <= high && heap[j + 1] > heap[j]) {
j = j + 1;
}
if (heap[j] > heap[i]) {
swap(heap[j], heap[i]);
i = j;
j = i * 2;
} else {
break;
}
}
}
//建大顶堆
void createHeap() {
for (int i = n/2; i >= 1; i--) {
downAdjust(i, n);
}
}
////对数组[low, high]范围内进行向上调整
//void upAdjust(int low, int high) {
// int i = high, j = i/2;
// while (j >= low) {
// if (heap[j] < heap[i]) {
// swap(heap[j], heap[i]);
// i = j;
// j = j/2;
// } else {
// break;
// }
// }
//}
////添加元素
//void insert(int x) {
// heap[++n] = x;
// upAdjust(1, n);
//}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> heap[i];
}
createHeap();
for (int i = n; i > 1; i--) {
swap(heap[i], heap[1]);
downAdjust(1, i-1);
}
for (int i = 1; i <= n; i++) {
if (i == 1) cout << heap[i];
else cout << " " << heap[i];
}
return 0;
}
本文介绍了一种使用大顶堆实现排序的方法。首先通过构建大顶堆,然后通过不断将堆顶元素与堆尾元素交换并重新调整堆,最终得到有序数组。文中详细展示了向下调整算法的具体步骤。
31万+

被折叠的 条评论
为什么被折叠?



