----


public class HeapSort {

    public static void main(String[] args) {
        int[] arr = {3,5,1,7,6,2};
        heapSort(arr);
        for (int i = 0; i < arr.length ; i++) {
            System.out.println(arr[i]);

        }
    }
    public static void heapSort(int[] arr){

        if(arr == null || arr.length<2){
            return;
        }
        //插入,使其变成一个大根堆
        for (int i = 0; i < arr.length ; i++) {
            heapInsert(arr,i);
        }
        //第一个数和最后一个数交换
        int size = arr.length;
        swap(arr,0,--size);
        while (size>0){
            heapfy(arr,0,size);
            swap(arr,0,--size);

        }

    }
    /*
    (index-1)/2为父节点的位置,不断的比较和父节点的大小
    这是一个向上调整的过程
     */

    public static void heapInsert(int[] arr,int index){
        //如果比父节点大,需要和父节点交换
        while (arr[index] > arr[(index-1)/2]){
            swap(arr,index,(index-1)/2);
            index = (index-1)/2;
        }

    }

    /*
    调整堆 ,左右两个孩子的最大值和我比,如果比我大,就和我交换,这是一个向下调整
    的过程
     */
    public static void heapfy(int[] arr,int index,int size){
        //左节点位置
        int left = index*2+1;
        while (left<size){
            //找左右两个孩子中较大的一个,left+1<size,确保不越界
            int largest = left+1<size && arr[left+1]>arr[left]?left+1:left;
            largest = arr[largest]>arr[index]?largest:index;
            if(largest == index){
                break;
            }
            //孩子比自己大,那么就需要调整了
            swap(arr,largest,index);
            index = largest;
            left = index*2+1;

        }
    }


    /*
    交换两个节点
     */
    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

}

 

---