小根堆的构建可以通过插入构建或调整建堆来完成
头文件,堆结构
#include<iostream>
using namespace std;
typedef int ELemtType;
#define MINVALUE -10000;
typedef struct Heap{
ELemtType *arry;
int size;
int capacity;
}*minHeap;
minHeap createHeap();
bool isFull(minHeap h);
void insert(minHeap &H,ELemtType k);
bool isEmpty(minHeap h);
void sort(minHeap &H);
void adjust(minHeap &H)
方法的定义
#include "stdafx.h"
#include"heap.h"
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
minHeap createHeap(int maxSize) {
minHeap heap = new Heap;
heap->arry = new ELemtType[maxSize+1];
heap->size = 0;
heap->arry[0] = MINVALUE;
heap->capacity = maxSize;
memset(heap->arry,INT_MAX,maxSize);
return heap;
}
bool isEmpty(minHeap H) {
return H->size == 0;
}
bool isFull(minHeap H) {
return H->capacity == H->size;
}
void insert(minHeap &H,ELemtType key) {
if(isFull(H)){
cout << "堆满,无法插入!"<<endl;
return;
}
int i = ++H->size;
for(;H->arry[i/2] > key;i/=2){
H->arry[i] = H->arry[i/2];
}
H->arry[i] = key;
}
void sort(minHeap &H,int i){
if(isEmpty(H)) {
cout << "堆空!" << endl;
return;
}
int child,parent;
int tmp = H->arry[i];
for(parent = i;parent * 2 <=H->size;parent = child){
child = parent * 2;
if(child + 1 <= H->size && H->arry[child] > H->arry[child+1]){
child = child + 1;
}
if(tmp < H->arry[child]) break;
else
H->arry[parent] = H->arry[child];
}
H->arry[parent] = tmp;
}
void adjust(minHeap &H) {
int i = H->size / 2;
for(;i>0;i--) {
//以每个有孩子结点的结点作为根节点,对其子树进行堆排序
sort(H,i);
}
}
//遍历
void levelTravers(minHeap H) {
for(int i = 1;i <= H->size;i++){
cout << H->arry[i] << " ";
}
cout << endl;
}
int main () {
int n;
cin >> n;
minHeap H = createHeap(n);
minHeap H2 = createHeap(n);
int k;
for(int i = 0;i < n;i++) {
cin >> H->arry[++H->size];
}
for(int i = 1;i<=n;i++){
insert(H2,H->arry[i]);
}
adjust(H);
levelTravers(H);
cout << endl;
levelTravers(H2);
cin >> n;
delete(H);
delete(H2);
}