#include <stdio.h>
#define N 10
// 二叉堆中的元素个数为N,那么其中最后一个非叶节点为A[N/2 - 1],调整的时候需要从最后一个非叶节点开始交换
int A[N] = {9,8,7,6,5,4,3,2,1,0};
void Swap(int *X, int *Y)
{
int Tmp;
Tmp = *X;
*X = *Y;
*Y = Tmp;
}
void Print()
{
printf("Swap: ");
for(int i = 0; i < N; i++)
{
printf("%d ", A[i]);
}
printf("\n");
}
// 递归调整顺序
void HeapAdjust(int M, int T)
{
int LeftChild = 2 * M + 1;
int RightChild = 2 * M + 2;
if(LeftChild < T && A[M] < A[LeftChild])
{
Swap(&A[M], &A[LeftChild]);
Print();
}
if(RightChild < T && A[M] < A[RightChild])
{
Swap(&A[M], &A[RightChild]);
Print();
}
if(LeftChild < T)
HeapAdjust(LeftChild, T);
if(RightChild < T)
HeapAdjust(RightChild, T);
//Print();
}
void BuildHeap()
{
for(int Mid = N / 2 - 1; Mid >= 0; Mid--)
{
HeapAdjust(Mid, N);
}
printf("BuildHeapFinished\n");
}
void HeapSort()
{
// 首先对初始堆排好序
BuildHeap();
// 然后根据剩余元素个数来循环,每次循环会删掉一个最大值,这个最大值通过与堆顶元素交换而来。
// 当只剩余一个元素循环停止,该元素就是最小的值
for(int i = N - 1; i >= 1; i--)
{
printf("---------------------\n"); // 交换第一个和最后一个
Swap(&A[0], &A[i]);
Print();
HeapAdjust(0, i);
}
}
int main()
{
Print();
HeapSort();
Print();
return 0;
}
最近复习《数据结构与算法分析》,发现教材上写的代码不完整,因此自己练习了一下。
参考http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html