堆排序

1.堆排序就是,先从无序数组构建大根堆。

 

2.再将堆顶元素与数组最后一个元素交换,再从当前的i交换

 

 

  //堆排序,1.先构建堆 2.再将堆顶与末尾交换,3.再重新调整堆,时间复杂度不论好坏都为 O(nlogn)
    public static void Heapsort(int[] arr){

        //1.构建堆
        for(int i = arr.length/2-1;i>=0;i--)
        {
            adjustHeap(arr,i,arr.length);
        }

        //for 交换堆顶元素,再调整
        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];

        //
        for(int j = i*2+1;j<length;j = j*2+1) {

            if(j+1<length && arr[j]<arr[j+1])
                j++;
            if(arr[j] > temp) {
                arr[i] = arr[j];
                i = j;
            }else{
                break;
            }
        }
        arr[i] = temp;

    }

    /*
    小顶堆排序尝试

     */
    public static void Heapsorts(int[] arr){

        //1.构建堆
        for(int i = arr.length/2-1;i>=0;i--)
        {
            adjustHeaps(arr,i,arr.length);
        }

        //for 交换堆顶元素,再调整
        for(int j = arr.length-1;j>0;j--)
        {
            swap(arr,0,j);
            adjustHeaps(arr,0,j);
        }

    }


    //小顶堆,堆排序
    public static void adjustHeaps(int []arr,int i,int length){

        //怎么调整呢?
        //把当前元素存下来
        int temp = arr[i];

        //
        for(int j = i*2+1;j<length;j = j*2+1) {

            if(j+1<length && arr[j]>arr[j+1])
                j++;
            if(arr[j] < temp) {
                arr[i] = arr[j];
                i = j;
            }else{
                break;
            }
        }
        arr[i] = temp;

    }






     /* 交换元素
     * @param arr
     * @param a
     * @param b
     */
    public static void swap(int []arr,int a ,int b){
        int temp=arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    public static void main(String[] args) {
        int []arr = {9,8,7,6,5,4,3,2,1};
        Heapsorts(arr);

        for(int a:arr)
            System.out.println(a);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值