李晓亮的博客

导航

对于堆排序算法的理解

Q1.为什么HeapSort在创建初始堆时循环的索引是从n/2开始的
A1.因为堆排序的数据存储结构是数组:
    若数组的索引从1开始,则若数组元素的个数为n,则以最后一个元素为左子节点的父节点的索引为n/2;依次类推,则以倒数第二个元素为左子节点的父元素的索引为n/2-1,...n/2-n/2-1;

    若数组的索引从0开始,则若数组元素的个数为n,则以最后一个元素为左子节点的父节点的索引为n/2-1;依次类推,则以倒数第二个元素为左子节点的父元素的索引为n/2-2,...n/2-n/2;

    若下标从1开始,则最后一个非叶子节点的索引为n/2(可通过绘制树形结构图来理解)。

    创建初始堆就是通过遍历所有非叶子节点,把数组中的最大值调整到树根的位置,即把数组建成最大堆。
Q2.堆调整函数的理解?
A2.将指定根节点(父节点)的子树中的最大值调整到子树根节点的位置。

http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/HeapSort.htm

posted on 2010-08-11 16:32  LeeXiaoLiang  阅读(208)  评论(0编辑  收藏  举报