堆排序
代码
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()。
 
                    
                 
                
            
         
 浙公网安备 33010602011771号
浙公网安备 33010602011771号