码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2015-11-08 15:09:36      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

对于堆排序,最重要的两个操作就是构造初始堆和调整堆;当然堆排序分为大顶堆和小顶堆,它是根据排序中根节点大小来描述的。

构造初始堆<大顶堆>:从最后一个非叶节点开始,使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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!