用程序实现:
(1)根据一个数组建立大根堆(最大堆);
(2)插入数据,向上调整为大根堆;
(3)删除根节点数据,重新调整为大根堆;
(4)堆排序
程序如下:
#include<iostream>
#include<assert.h>
//#include"List.h"
#include<string>
//#include"Stack.h"
//#include"Tree.h"
#define MAX 100
using namespace std;
//根据数据创建堆
void CreateHeap(int *heap, int length);
//向下调整堆中元素
void AdjustDownHeap(int *heap, int i, int length);
//向上调整堆中元素
void AdjustUpHeap(int *heap, int i, int length);
//向堆中插入元素
int InsertHeap(int *heap, int length, int x);
//删除元素,每次只能删除根节点
int DeleteHeap(int *heap, int length);
//堆排序
void SortHeap(int *heap, int length);
int main()
{
int heap[7] = {4,5,6,9,8,7};
printf("根据所给数组元素创建大根堆:");
CreateHeap(heap,6);
for (int i = 0; i < 6;i++)
{
printf("%d ",heap[i]);
}
printf("\n");
printf("插入元素10,向上调整:");
InsertHeap(heap,6,10);
for (int i = 0; i < 7; i++)
{
printf("%d ", heap[i]);
}
printf("\n");
printf("删除根节点,调整为大根堆:");
DeleteHeap(heap, 7);
for (int i = 0; i < 6; i++)
{
printf("%d ", heap[i]);
}
printf("\n");
printf("根据大根堆进行堆排序:");
SortHeap(heap, 6);
for (int i = 0; i < 6; i++)
{
printf("%d ", heap[i]);
}
printf("\n");
return 0;
}
//根据数据创建堆,用数组创建堆
void CreateHeap(int *heap,int length)
{
//向下调整创建大根堆
for (int i = length / 2-1; i >= 0;i--)
{
AdjustDownHeap(heap, i, length);
}
}
//向下调整堆中元素
void AdjustDownHeap(int *heap,int i,int length)
{
int temp = 0;
int nChild;
while ((2 * i + 1)<length)
{
nChild = 2 * i + 1;
//当存在左右儿子节点时,判断左儿子节点和右儿子节点大小关系
if (heap[nChild]<heap[nChild + 1] && nChild+1<length)
{
nChild++;
}
if (heap[i]<heap[nChild])
{
temp = heap[i];
heap[i] = heap[nChild];
heap[nChild] = temp;
i = nChild;
}
else
{
break;
}
}
}
//向堆中插入元素,将元素插入到堆最后位置,再向上调整
int InsertHeap(int *heap,int length,int x)
{
int i = length;
int temp = 0;
heap[length] = x;
while (i>0)
{
if (heap[i]>heap[(i-1)/2])
{
temp = heap[i];
heap[i] = heap[(i - 1) / 2];
heap[(i - 1) / 2] = temp;
i = (i-1) / 2;
}
else
{
break;
}
}
//返回插入位置
return i;
}
//删除元素,只能删除根节点;将根节点换成堆最后一个元素,删除根节点,然后再向下调整使之变成大根堆
int DeleteHeap(int *heap, int length)
{
int topNum = heap[0];
heap[0] = heap[length-1];
AdjustDownHeap(heap,0,length-1);
//返回根节点元素
return topNum;
}
//堆排序
void SortHeap(int *heap, int length)
{
int index = length - 1;
int temp = 0;
int num = 0;
while (index > 0)
{
temp = heap[0];
heap[0] = heap[index];
heap[index] = temp;
AdjustDownHeap(heap, 0, index);
index--;
}
}