堆与数组的关系
堆是一种逻辑结构(形象的表示数据的存储格式),数组则是数据的实际存储结构(对应数据的存储地址),堆中的根节点与左右子节点在存储数组中的位置关系如下:假设根节点在数组中的位置(数组下标)为 i ,那么左节点在数组中的位置(数组下标)为 i * 2 + 1 , 右节点在数组中的位置(数组下标)为 i * 2 + 2 。
/// <summary>
/// 堆排序算法
/// </summary>
static void HeapSortFoo(int[] arr)
{
BuildMaxHeap(arr);//创建大顶堆(初始状态看做:整体无序)
for (int i = arr.Length - 1; i >0 ; i--)
{
Swap(arr,0,i);
//将堆顶元素依次与无序区的最后一位交换(使堆顶元素进入有序区)
MaxHeapify(arr,0,i);
//重新将无序区调整为大顶堆
}
}
/// <summary>
/// 创建大顶堆(根节点大于左右子节点)
/// </summary>
static void BuildMaxHeap(int[] arr)
{
//根据大顶堆的性质可知:数组的前半段的元素为根节点,其余元素都为叶节点