#include "string"
#include "vector"
#include "time.h"
typedef std::basic_string<TCHAR> tstring;
typedef std::vector<int> IntVec;
// iIndexAdjust 从0计数.... left = 2i+1;right = 2i+2
// 最后一个非叶子节点 (iHeapTreeSize - 2) / 2
// iHeapTreeSize 无序堆大小(无序区节点数)
void HeapifyMax(IntVec & iHeapTree,int const iIndexAdjust,int const iHeapTreeSize)
{
if (iIndexAdjust > (iHeapTreeSize - 2) / 2)//只针对非叶子节点
return;
int iIndexGreater = iIndexAdjust;
int child = 2 * iIndexAdjust + 1;
if (child < iHeapTreeSize && iHeapTree[child] > iHeapTree[iIndexGreater])
iIndexGreater = child;
child = 2 * iIndexAdjust + 2;
if (child < iHeapTreeSize && iHeapTree[child] > iHeapTree[iIndexGreater])
iIndexGreater = child;
if (iIndexAdjust == iIndexGreater)
return;
std::swap(iHeapTree[iIndexAdjust], iHeapTree[iIndexGreater]);
HeapifyMax(iHeapTree, iIndexGreater, iHeapTreeSize);//重新修正子树
}
// 从最后一个非叶子节点开始构建
void HeapBuild(IntVec & iHeapTree){
for (int i = (iHeapTree.size() - 2) / 2; i >= 0; i--){
HeapifyMax(iHeapTree, i,iHeapTree.size());
}
}
void HeapSort(IntVec & iHeapTree){
for (int i = iHeapTree.size() - 1; i >= 0; i--)
{
std::swap(iHeapTree[0], iHeapTree[i]);
HeapifyMax(iHeapTree, 0, i); // 最后一个参数 HeapBuild时是 iHeapTree.size(),交换一次根,少一个节点
}
}
void HeapPrint(IntVec & iHeapTree){
for (auto i:iHeapTree){
printf("%d ", i);
}
printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned int)time(0));
IntVec ints;
for (int i = 0; i < 20; i++){
ints.push_back(rand() % 100);
}
printf("arr init\n");HeapPrint(ints);
HeapBuild(ints);
printf("arr after build \n"); HeapPrint(ints);
HeapSort(ints);
printf("arr after sort \n"); HeapPrint(ints);
return 0;
}
arr init 74 51 18 91 59 88 48 16 76 23 17 64 52 82 30 67 52 5 93 12 arr after build 93 91 88 76 59 64 82 67 74 23 17 18 52 48 30 16 52 5 51 12 arr after sort 5 12 16 17 18 23 30 48 51 52 52 59 64 67 74 76 82 88 91 93
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ezhong的博客签名-------------------------------------
以上内容来自ezhong的博客园,作者:ezhong
ezhong的博客园: http://www.cnblogs.com/ezhong
感谢您的阅读。感谢您的分享。
浙公网安备 33010602011771号