标签:
对于堆排序,最重要的两个操作就是构造初始堆和调整堆;当然堆排序分为大顶堆和小顶堆,它是根据排序中根节点大小来描述的。
构造初始堆<大顶堆>:从最后一个非叶节点开始,使Key[i]>=Key[2i+1]&&key>=key[2i+2]
void heap_sort_init(int *pArr, int len)
{
int i;
for(i = len/2 - 1;i >= 0; i--)
{
heap_sort_fix(pArr, i, len);
} //for
} //heap_sort_init
调整堆<大顶堆>:从父节点、左孩子节点、右孩子节点三者中选择最大者跟父节点进行交换(交换之后可能造成被交换的孩子节点不满足堆的性质,因此每次交换之后要重新对被交换的孩子节点进行调整)
void heap_sort_fix(int *pArr, int loc, int len)
{
int lIndex, rIndex, mIndex;
lIndex = loc * 2 + 1;
rIndex = loc * 2 + 2;
mIndex = len/2 - 1;
if(loc <= mIndex)
{
mIndex = loc;
if(pArr[mIndex] < pArr[lIndex])
{
mIndex = lIndex;
}
if(rIndex <= len - 1 && pArr[mIndex] < pArr[rIndex])
{
mIndex = rIndex;
}
if(mIndex != loc)
{
swap3(pArr + loc, pArr + mIndex);
heap_sort_fix(pArr, mIndex, len);
}
} //if
} //heap_sort_fix
实现:
void heap_sort(int *pArr, int len)
{
if(NULL == pArr)
return;
int i;
heap_sort_init(pArr, len);
for(i = len - 1; i > 0; i--)
{
swap3(pArr + i, pArr);
heap_sort_fix(pArr, 0, i);
} //for
} //heap_sort
例如:0-5七个节点<摘选自百度经验>
原始堆
构造初始化堆
第一个非叶子节点--节点二
第二个非叶子节点--节点一
根节点--节点零及由于调整根节点而影响到的节点--节点一
堆排序:
最大的值在构造初始话堆完毕就选出来了,根节点直接与末节点交换,第一个元素排序成功
由根节点开始调整堆,第二个元素排序成功
...
...
...
标签:
原文地址:http://www.cnblogs.com/kellis/p/heap_sort.html