堆是一种特殊的二叉树,它具有以下两个性质:
1、每个节点的值大于或等于其每个子节点的值;
2、该树完全平衡,最后一层的叶子都处于最左侧的位置。
有最大堆和最小堆之分,以上定义是最大堆的定义,最小堆的定义如下:
1、每个节点的值小于或等于其每个子节点的值;
2、该树完全平衡,最后一层的叶子都处于最左侧的位置。
本文实现了堆的建立、删除、插入、堆排序。
本文中的例子以最大堆为例:// heap_function.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
void swap(int *p, int *q)
{
int temp = *p;
*p = *q;
*q = temp;
}
void MoveUp(int heap[],int start)//向上移动的操作,用于向堆中插入元素用//
{
int i = start;
int j = (i -1)/2;
while(i>0)
{
if (heap[i] > heap[j])
{
swap(&heap[i],&heap[j]);
i = j;
j = (i-1)/2;
}
else
break;
}
}
void insert_ele(int heap[], int value, int &count)//向堆中插入元素,count为堆中元素的个数,//
{
heap[count] = value;
MoveUp(heap,count);
count++;
}
void MoveDown(int heap[], int first, int last)
{
int largest = 2*first+1;
while(largest<= last)
{
if (largest<last && heap[largest] < heap[largest+1])
largest = largest + 1;
if (heap[largest] > heap[first])
{
swap(&heap[largest], &heap[first]);
first = largest;
largest = 2* largest + 1;
}
else
largest = last + 1;
}
}
void delete_ele(int heap[], int &count)//从堆中删除堆顶元素//
{
heap[0] = heap[count-1];
count--;
MoveDown(heap,0,count-1);
}
void FloyAlgorithm(int heap[],int n)//从底到顶构建堆,n为元素个数//
{
for (int i = n/2 -1; i >= 0; i --)
{
MoveDown(heap,i, n-1);
}
}
void WilliamsAlgorithm(int heap[], int n)//从顶到底构建堆,由John Williams提出//
{
for (int i = 0; i < n; i ++)
{
MoveUp(heap,i);
}
}
void heapsort(int heap[], int n)//堆排序
{
for (int i = n/2 -1; i >=0; --i)
MoveDown(heap,i,n-1);
for (int i = n-1; i >=1; --i)
{
swap(&heap[0],&heap[i]);
MoveDown(heap,0,i-1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int data[9] = {2,8,6,1,10,15,3,12,11};
//heapsort(data,9);
//FloyAlgorithm(data,9);
WilliamsAlgorithm(data,9);
for (int i = 0; i < 9; ++i)
{
cout<<data[i]<<" ";
}
return 0;
}