小根堆:所有子节点都大于其父节点。
大根堆:所有子节点都小于其父节点。
int heapSize = 0;
//返回左子节点索引
int Left(int index){return ((index << 1) + 1);}
//返回右子节点索引
int Right(int index){return ((index << 1)+ 2;)}
//交换a,b的值
void swap(int *a, int *b){int temp = *a; *a = *b; *b = temp;}
//array[index]与其左、右子树进行递归对比
//用最大值替换array[index],index表示堆顶索引
void maxHeapify(int array[], int index)
{
int largest = 0;
int left = Left(index); //左子节点索引
int right = Right(index); //右子节点索引
//把largest赋为堆顶与其左子节点的较大值
if((left <= heapSize) && (array[left] > array[index]))
largest = left;
else
largest = index;
//把largest与堆顶的右子节点比较,取较大值
if((right <= heapSize) && (array[right] > array[largest]))
largest = right;
//此时largest为堆顶、左子节点、右子节点中的最大值
if(largest != index)
{
//如果堆顶不是最大值,则交换,并递归调整堆
swap(&array[index],&array[largest]);
maxHeapify(array, largest);
}
}
//初始化堆,将数组中的每一个元素置放到适当的位置
//完成之后,堆顶的元素为数组的最大值
void buildMaxHeap(int array[], int length)
{
int i;
heapSize =length; //堆大小赋为数组长度
for( i = (length >> 1); i >=0; i--)
{
maxHeapify(array, i);
}
}
void heap_sort(int array[], int length)
{
int i;
//初始化堆
buildMaxHeap(array, (length - 1));
for(i = (length - 1); i >= 1; i--)
{
//堆顶元素array[0](数组的最大值)被置换到数组的尾部array[i]
swap(&array[0],&array[i]);
heapSize--; //从堆中移除该元素
maxHeapify(array, 0); //重建堆
}
}