最小堆的建立
最小堆的建立有两种方式的插入
一种是逐次插入的时候排序成完全二叉树,代码比较简单。
另一种是借助堆排序的方法,先输入所有的节点,再通过类似于堆的删除操作的方式,从存在子节点的节点开始反向排序,将所有的节点捋顺。
具体代码实现
#include <iostream>
#include <malloc.h>
const int MinData = -100000;
const int MaxSize = 1005;
using namespace std;
typedef struct HeapStruct *Heap;
struct HeapStruct{
int *data;//数组
int size;//当前元素个数
int capacity;//最大容量
};
Heap create()
{
Heap H;
H = (Heap)malloc(sizeof(struct HeapStruct));
H->data = (int*)malloc(sizeof(int)*(MaxSize +1));
H->size = 0;
H->capacity = MaxSize;
H->data[0] = MinData;
return H;
}
void Insert(Heap H,int x)
{
H->size++;
int i = H->size;
for(; H->data[i/2]>x ;i/=2){
H->data[i] = H->data[i/2];
}
H->data[i] = x;
}
void sort(Heap H,int i)
{
int child,parent;
int temp = H->data[i];
for(parent = i;parent*2 <= H->size;parent = child){
child = 2*parent;
if((child != H->size)&&(H->data[child+1] < H->data[child]))
child++;
if(H->data[child] >= temp)
break;
else
H->data[parent] = H->data[child];
}
H->data[parent] = temp;
}
void adjust(Heap H)
{
int i = H->size/2;//i为最后一个有孩子的节点
for(;i>0;i--){
//每个有孩子的节点为根,堆排序
sort(H,i);
}
}
void circle(Heap H)
{
for(int i=1;i<=H->size ;i++){
cout<<H->data[i]<<" ";
}
}
int main()
{
Heap H,I;
H = create();
I = create();
//插入法
Insert(H,9);
Insert(H,22);
Insert(H,33);
Insert(H,41);
Insert(H,52);
Insert(H,64);
circle(H);
printf("\n");
//排序法
I->data[1] = 33;
I->data[2] = 9;
I->data[3] = 22;
I->data[4] = 64;
I->data[5] = 52;
I->data[6] = 41;
I->size = 6;
adjust(I);
circle(I);
return 0;
}