java 堆排序

java 堆排序  思想:将待排序的数组构造一个大顶堆,最大值为堆顶元素,然后跟数组最后一个元素交换,对除最后一个元素的数组进行重新构造一个大顶堆,以此类推,最后会生成一个升序的数组。

大顶堆:所有的父节点大于左右子节点的值

小顶堆:所有的父节点小于左右节点的值。

public static void main(String[] args){
        int[] arr = {12,20,5,16,15,1,30,45,23,9};
        heapSort(arr);
        System.out.println(Arrays.toString(arr));

    }
    public static void heapSort(int[] arr){
        //1.构建初始堆,arr[0]为最大元素
        buildMaxHeap(arr);
        // 注意这里是i>1 只有三个元素时----最后一次执行
        for(int i=arr.length-1;i>1;i--){
            swap(arr,0,i);
            adjustHeap(arr,0,i);
        }
    }

    /**
     * 构建最大堆,arr[0] 是最大值
     * @param arr
     */
    public static void buildMaxHeap(int[] arr){
        for(int i=(arr.length-1-1)/2;i>=0;i--){
            adjustHeap(arr,i,arr.length);
        }
    }

    /**
     * 调整堆,k 父节点的编号 length: 需要调整的数组的范围的长度从1到length
     * @param arr
     * @param k
     * @param length
     */
    public static void adjustHeap(int[] arr,int k,int length){
        int temp=arr[k];
        for(int i=2*k+1;i<length-1;i=i*2+1){
            if(arr[i]<arr[i+1]){
                i++;
            }
            if(temp>arr[i]){
                break;
            }else{
                arr[k]=arr[i];
                k=i;
            }
        }
        arr[k]=temp;
    }
    public static void swap(int[] arr,int i,int j){
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }

猜你喜欢

转载自blog.csdn.net/u011243684/article/details/84895262