在这里补充O(n)建堆的代码,代码很简单,看看就会明白:
/*
* File: main.cpp
* Author: cyb
*
* Created on 2013年5月8日, 下午4:05
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 10001;
//堆的大小在Heap[0]中为元素的个数
int Heap[MAXN];
/*维护堆的性质*/
void HeapContain(int Heap[], int father) {
//求出左右儿子
int left_child = father << 1;
int right_child = (father << 1) + 1;
int big_index = father;
if (left_child <= Heap[0] && Heap[left_child] > Heap[father]) {
big_index = left_child;
}
if (right_child <= Heap[0] && Heap[right_child] > Heap[father]) {
big_index = right_child;
}
if (big_index != father) {
Heap[father] ^= Heap[big_index];
Heap[big_index] ^= Heap[father];
Heap[father] ^= Heap[big_index];
HeapContain(Heap, big_index);
}
}
void BuildHeap(int Heap[]) {
for (int i = 1; i < Heap[0] / 2; i++) {
HeapContain(Heap,i);
}
}
int main(int argc, char** argv) {
return 0;
}