堆排序

public class HeapSort{

    public static void createHeap(int[] data, int n)
    {
        //n/2-1  为最后一个孩子节点的父节点
        for(int i = (n/2 - 1); i >= 0; i--)
        {
            ajustHeap(data, i ,n);
        }
    }

    public static void exchangeHeap(int[] data, int n)
    {
        //调整第一个和最后一个数,再调整堆
        for(int i = n - 1; i >= 0; i--)
        {
            swap(data, 0, i);
            //每次都是从0号根节点处向下调整
            ajustHeap(data, 0, i);
        }
    }

    //小顶堆
    public static void ajustHeap(int[] data. int i, int n)
    {
        int j = 2 * i - 1; //左孩子
        while(j < n)
        {
            if( j+1<n && data[j] > data[j+1])
                j++;
            if(data[i] < data[j]) //这里就表明了下面的data[i] > data[j]
                break;
            swap(data,i,j);
            i = j;
            j = 2 * i - 1; 
        }
    }

}
原文地址:https://www.cnblogs.com/GlazedCat/p/10549145.html