堆的两种核心操作
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int heap[N];
int len;
void down(int idx) {
int t = idx;
if (idx * 2 <= len && heap[idx * 2] < heap[t])t = idx * 2;
if (idx * 2 + 1 <= len && heap[idx * 2 + 1] < heap[t])t = idx * 2 + 1;
if (t != idx) {
swap(heap[idx], heap[t]);
down(t);
}
}
void up(int idx) {
while (idx / 2 && heap[idx] < heap[idx / 2]) {
swap(heap[idx], heap[idx / 2]);
idx /= 2;
}
}
堆的基本操作
1.取出堆顶
heap[1]
2.删除堆顶元素
swap(heap[1],heap[size--]);
down(1);
3.堆中插入一个元素
heap[++size]=x;
up(size);
4.修改指定位置的值
heap[k]=x;
up(k),down(k);
5.删除指定位置的值
swap(heap[size--],heap[k]);
up(k),down(k);
堆排序
#include<iostream>
using namespace std;
int n, m, len;
const int N = 1e5+10;
int heap[N];
void down(int idx) {
int t = idx;
if (idx *2<=len && heap[idx*2] < heap[t])t = idx*2;
if (idx*2+1 <= len && heap[idx*2+1]<heap[t])t = idx *2+1;
if (t != idx) {
swap(heap[t], heap[idx]);
down(t);
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)cin >> heap[i];
len = n;
for (int i = len/2; i; i--)down(i);
while (n--) {
cout << heap[1] << ' ';
heap[1] = heap[len];
len--;
down(1);
}
}