原文图文并茂 https://www.cnblogs.com/chengxiao/p/6129630.html?tdsourcetag=s_pcqq_aiomsg

import java.util.Arrays;

public class HeapSort
{
    public static void main(String[] args)
    {
         int[] arr = {9,8,7,6,5,4,3,2,1};
         sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr)
    {
        //构建大顶堆
        for(int i= arr.length/2-1;i>=0;i--)
        {
            adjustHeap(arr,i,arr.length);
        }

        //调整堆结构+交换堆顶元素与末尾元素
        for(int j = arr.length-1;j>0;j--)
        {
            swap(arr,0,j);
            adjustHeap(arr,0,j);
        }

    }

    /**
     * 调整大顶堆(仅是调整过程,建立在大顶堆已经构建的基础上)
     * @param arr
     * @param i
     * @param length
     */
    public static void adjustHeap(int[] arr,int i, int length)
    {
        //取出当前元素
        int temp  = arr[i];

        //从i的左子节点开始,也就是2 * i + 1处开始
        for(int k = 2*i+1; k<length;k=2*k+1)
        {
            //如果左子节点小于右子节点,k指向右子节点
            if(k+1 < length && arr[k] < arr[k+1])
            {
               k++;
            }

            //如果子节点大于父节点,将子节点的值赋给父节点
            if(arr[k] > temp)
            {
                arr[i] = arr[k];
                i = k;
            }
            else
                break;
        }

        //将temp值放到最终的位置
        arr[i] = temp;
    }

    public static void swap(int[] arr,int a, int b)
    {
        int temp  = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}