堆排序示意图详解
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&<(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&>(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]重新成为大(小堆) } } };
下面为示意图