1 void HeapAdjust (HeapType &H, int s, int m) 2 { // 已知 H.r[s..m]中记录的关键字除 H.r[s] 之外 3 //均满足堆的特征,本函数自上而下调整 H.r[s] 4 //的关键字,使 H.r[s..m] 也成为一个大顶堆 5 rc = H.r[s]; // 暂存 H.r[s] 6 for ( j=2*s; j<=m; j*=2 ) 7 8 { // j 初值指向左孩子 9 10 自上而下的筛选过程; 11 } 12 // 自上而下的筛选过程 13 if ( j<m && H.r[j].key>H.r[j+1].key ) 14 ++j; 15 // 左/右“子树根”之间先进行相互比较 16 // 令 j 指示关键字较小记录的位置 17 if ( rc.key <= H.r[j].key ) 18 break; 19 // 再作“根”和“子树根”之间的比较, 20 // 若“>=”成立,则说明已找到 rc 的插 21 // 入位置 s ,不需要继续往下调整 22 H.r[s] = H.r[j]; s = j; 23 // 否则记录上移,尚需继续往下调整 24 H.r[s] = rc; // 将调整前的堆顶记录插入到 s (注意插入的位置为s j=2*s) 25 } // HeapAdjust 26 27 void HeapSort ( HeapType &H ) { 28 // 对顺序表 H 进行堆排序 29 for ( i=H.length/2; i>0; --i ) 30 HeapAdjust ( H.r, i, H.length ); // 建小顶堆 31 32 for ( i=H.length; i>1; --i ) { 33 H.r[1]←→H.r[i]; 34 // 将堆顶记录和当前未经排序子序列 35 // H.r[1..i]中最后一个记录相互交换 36 HeapAdjust(H.r, 1, i-1); // 对 H.r[1] 进行筛选 37 } 38 } // HeapSort
原文:http://www.cnblogs.com/hellochennan/p/5379155.html