堆排序

本文介绍了一种使用大顶堆实现排序的方法。首先通过构建大顶堆,然后通过不断将堆顶元素与堆尾元素交换并重新调整堆,最终得到有序数组。文中详细展示了向下调整算法的具体步骤。
#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值