对排序,先mark在这,慢慢理解,来源C和C++程序员面试秘籍
#include <iostream>
using namespace std;
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); // 重建堆
}
}