堆排序也是一种较为简单和常用的排序方式,其在面试和工程实践中常被提及。具体的理论知识在严蔚敏、吴伟民版《数据结构》课本上非常清晰。这里,仅展示其C++语言实现。
void HeapAjust(int a[],int cur,int tail)
{
int max = cur;//在当前节点的小树中调整
int left = cur*2;//当前节点的左子树
int right = cur*2+1;//当前节点的右子树
if(cur <= tail/2)//右子树小于
{
if(a[max] < a[left] && left <= tail)
max = left;
if(a[max] < a[right] && right <= tail)
max = right;
if(max != cur)//在自身和左右子节点中找到最大的,并进行替换
{
swap(a[max],a[cur]);
HeapAjust(a,max,tail);//对替换后的子树进行堆排序
}
}
}
void InitHeap(int a[], int tail)
{
//从最后一个非叶节点开始初始化堆;
for(int i = tail/2 ; i >= 1 ; i--)
HeapAjust(a,i,tail);
}
void BuildHeap(int a[],int tail)
{
InitHeap(a,tail);
for(int i = tail; i >=1 ; i--)
{
swap(a[i],a[1]);//将最后一个叶节点与根调换
HeapAjust(a,1,i-1);//调整剩下的元素,构造新的堆;
}
}