堆排序

代码

public static void sort(Comparable[] a)
{
    int N = a.length;
//构造堆
for (int k = N/2; k >= 1; k--) sink(a, k, N);
//排序
while (N > 1) { exch(a, 1, N--); sink(a, 1, N); } }

 

理解这段代码的意思(假设我们是从小到大排序):

  1.先构造一个根节点为最大数的堆

  2.将根节点与最后的数交换,然后将根节点sink()

 

虽然是以数组的形式存储,但是却是将数组抽象成堆的形式。

 

需要注意的一点是为什么构造堆时候用的是 k = N/2?

  很简单,因为k = (N/2)+1时,并没有子节点,也就没有地方sink()。

 

posted on 2019-05-18 10:12  rivsidn  阅读(88)  评论(0)    收藏  举报

导航