关于堆排序的问题~~请教大家

ruanruan0527 2011-06-26 04:24:41
堆排序的基本思想里面说到,把堆顶a[0]元素(为最大元素)和当前最大堆的最后一个元素交换,什么叫最大堆的最后一个元素?我看了后面的转化例子,可是还是不是很懂~~请教大家了
...全文
192 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
agilely 2011-06-30
  • 打赏
  • 举报
回复
攒分中。。 lz给我分把。。。
agilely 2011-06-30
  • 打赏
  • 举报
回复
比如n个元素 我们要升序排列
首先一趟heap调整a[0]-a[n-1]为大顶堆 这样a[0]就是a[0]-a[n-1]最大的了
然后把a[0]和a[n-1]互换 这样最大的就放到a[n-1]了

在对a[0]-a[n-2]heap调整为大顶堆 这样a[0]就是a[0]-a[n-2]最大的了
然后把a[0]和a[n-2]互换 这样次大的就放到a[n-2]了

在对a[0]-a[n-3]heap调整为大顶堆 这样a[0]就是a[0]-a[n-3]最大的了
然后把a[0]和a[n-3]互换 这样次次大的就放到a[n-2]了

。。。。
就这样下去
ruanruan0527 2011-06-30
  • 打赏
  • 举报
回复
最后一个元素是,把堆转化成数组以后的最后的那一个。。。。真的就是字面的意思,囧。
ljsspace 2011-06-28
  • 打赏
  • 举报
回复
堆排序就是根据堆的两个性质来的,没什么玄机。。。
z2038531 2011-06-28
  • 打赏
  • 举报
回复
错了 最大堆的最后元素 为spris:<SDD SFFF>:
gabby123 2011-06-27
  • 打赏
  • 举报
回复
先把整个数组变成最大堆,反复进行,直到堆为空。
Nishang123 2011-06-27
  • 打赏
  • 举报
回复
汗~~·我看着都头晕
SuperFC 2011-06-27
  • 打赏
  • 举报
回复
《算法导论》里面讲的很清楚!LZ看看吧
fengtaocat 2011-06-27
  • 打赏
  • 举报
回复
一般是在数组上建立堆,所以size为n的堆的最后一个元素就是数组的第n个元素
zhanghaigang 2011-06-26
  • 打赏
  • 举报
回复
不错啊,这年头
MAY 2011-06-26
  • 打赏
  • 举报
回复
受教了
ljsspace 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ruanruan0527 的回复:]

88 76 50

76 40 50 40 32 40

50 10 9 32 5 10 9 32……
[/Quote]

取走堆顶元素76,将32移到堆顶,然后32跟50交换(因为32比50小,50是第二层中最大的数).
ruanruan0527 2011-06-26
  • 打赏
  • 举报
回复
晕,这里面怎么打不出来那个格式啊、、、
ruanruan0527 2011-06-26
  • 打赏
  • 举报
回复
88 76 50

76 40 50 40 32 40

50 10 9 32 5 10 9 32 5 10 9

5
(A) (B) (C)
可是这个从B如何到的C 啊?交换到底是怎么个交换呢,感觉还是不很清楚.
ljsspace 2011-06-26
  • 打赏
  • 举报
回复
就是最后一个叶子结点,这样可以保持堆仍然是一颗完全二叉树.
stein42 2011-06-26
  • 打赏
  • 举报
回复
堆排序是一种选择排序。

先把整个数组变成一个最大堆。

每次选堆里面的最大元素,也就是a[0],
堆最后一个元素,也就是a[heap_size-1],heap_size是堆的大小,
交换它们,同时heap_size减一,再恢复堆的性质。

反复进行,只到堆为空。

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧