代码改变世界

堆排序示意图详解

2012-09-12 21:14  neu_zjujunge  阅读(752)  评论(0编辑  收藏  举报

参照高一凡老师的《面向对象的C++数据机构算法实现与解析》,画出其程序流程,加深理解。

部分程序源代码如下

typedef int KeyType;
#include "SqTable.h"
template<typename D>class HSort:public SqTable<D>
{
private:
    void HeapAdjust(int low, int high, bool flag)
    {
        int j;
        elem[0]=elem[low];
        for(j=2*low; j<=high; j*=2)
        {  //j指向待调整数据low的左孩子,沿key较大(小)的孩子节点向下筛选
            if(flag) //大顶堆,升序
            {
                if(j<high&&LT(elem[j].key, elem[j+1].key))
                    ++j;  //j指向low的右孩子
                if(!LT(elem[0].key, elem[j].key))  //low的关键字不大于j的关键字
                    break; //不必再调整,跳出for循环 
            }
            else //小顶堆,降序
            {
                if(j<high&&GT(elem[j].key, elem[j+1].key))
                    ++j;
                if(!GT(elem[0].key, elem[j].key))
                    break;
            }
            elem[low]=elem[j];  //否则,j为大(小)顶,插入low
            low=j;         //low的节点向下移到j(原左或右孩子处)   
        }
        elem[low]=elem[0];
    }
public:
    void HeapSort(bool flag)
    {
        int i;
        for(i=length/2; i>=1; --i)
            HeapAdjust(i,length,flag);
        for(i=length; i>=2; --i)
        {
            swap(elem[1], elem[i]);
            //交换堆顶数据1和未完全排序的elem[1~i]中最后一个数据i
            HeapAdjust(1, i-1, flag);  //调整elem[1],使elem[1~i-1]重新成为大(小堆)
        }
    }
};

下面为示意图