最大堆特性是指除了根以外的每个结点i,有A[PARENT(i)] >= A[i]。 至于堆排序的具体应用,在后面的最短路算法—Dijkstra中,会用到由堆来优化普通的Dijkstra算法。 堆排序相对简单,不做过多解释
/**
*Author@da_fan_shu_
*Time@23/9/2012
*Goal@最大堆排序
**/
/*在堆排序算法中,使用的是最大堆,最小堆通常在构造优先级队列时使用*/
//C++代码
#include<iostream>
using namespace std;
//打印堆数组
void PrintHeapArray(int* A,int n)
{
for(int i=1;i<=n;i++)
{
cout<<A[i]<<" ";
}
cout<<endl;
}
//交换变量的值
void swap(int* x,int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
//建立以i为根节点的大顶堆
void Max_Heapify(int* A,int i,int heapsize)
{
int l = 2 * i;
int r = 2 * i + 1;
int largest;
if(l <= heapsize && A[l] > A[i])
{
largest = l;
}
else largest = i;
if(r <= heapsize && A[r] > A[largest])
{
largest = r;
}
if(largest != i)
{
swap(&A[largest],&A[i]);
Max_Heapify(A,largest,heapsize);//处于根为largest的堆有可能被破坏,递归进行调整
}
}
//建立初始堆
void Build_Max_Heap(int* A,int heapsize)
{
for(int i = heapsize/2;i >= 1;i--)
{
Max_Heapify(A,i,heapsize);
}
}
//堆排序
void HeapSort(int* A,int heapsize)
{
Build_Max_Heap(A,heapsize);
for(int i = heapsize;i >= 2;i--)
{
swap(&A[1],&A[heapsize]);
heapsize--;
Max_Heapify(A,1,heapsize);
}
}
int main()
{
int heapsize;
int A[100];
cout<<"输入数组元素个数:";
cin>>heapsize;
cout<<endl;
for(int i = 1;i <= heapsize;i++)
{
cout<<"输入数组A["<<i<<"]:";
cin>>A[i];
}
HeapSort(A,heapsize);
PrintHeapArray(A,heapsize);
return 0;
}