堆排序

先构建大顶堆

下沉操作 左节点 或者右节点 大于父节点 那么互换 ,然后递归子子节点

大顶堆堆顶与数组尾部互换



public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 将给定数组排序
     * @param arr int整型一维数组 待排序的数组
     * @return int整型一维数组
     */
    public int[] MySort (int[] arr) {
        // write code here
        int length = arr.length;
        buildHead(arr);
        for(int i=length-1;i>0;i--){
            swap(arr,0,i);
//             length--;
            downJust(arr,0,i);
        }
        return arr;
    }
    
    public void downJust(int[] arr, int parent,int length){
        int large = parent;
        int leftChild = 2*parent +1;
        int rightChile = 2*parent +2;
        if(leftChild<length &&(arr[leftChild]>arr[large])){
            large = leftChild;
        }
        if(rightChile<length &&(arr[rightChile]>arr[large])){
            large = rightChile;
        }
        if(large == parent){
            return;
        }
        if(large != parent){
              swap(arr,large,parent);
               downJust(arr,large,length);
        }
    }
    public void swap(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    public void buildHead(int[] arr){
        int length = arr.length;
        for(int i = length/2;i>=0;i--){
            downJust(arr,i,length);
        }
        
    }
}