排序~堆排序

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution{

    public static void main(String[] args) {
       
            int arr[]=new int[]{-5,80,33,-9,107,9,65,60,77,90,220,55,190,60};
             heapSort(arr);

            System.out.printf(Arrays.toString(arr));

    }

    //堆排序
    public static void heapSort(int arr[]){
        //1.初始化大顶堆
        //从下往上,右往左调整
        for (int i = arr.length/2-1; i >=0 ; i--) {
                adjustheap(arr,i,arr.length);
        }
        //2.排序,调整把最大的元素放到数组末尾
        for (int i = arr.length-1; i >=0 ; i--) {
            //交换首尾
            int t=arr[0];
            arr[0]=arr[i];
            arr[i]=t;
            //从新调整大顶堆
            adjustheap(arr,0,i);
        }


    }
    //调整大顶堆
    private static void adjustheap(int[] arr, int i, int length) {
        int temp=arr[i];//先取出当前元素
        for (int k = i*2+1; k < length; k=k*2+1) {   //得到i的左右节点
            if(k+1<length && arr[k]<arr[k+1]){//有右节点,并且右节点大
                k++;//k指向最大的节点
            }
            if (arr[k]>temp){//孩子节点比根节点大
                arr[i]=arr[k];//把最大的节点放到i,即放到当前的根节点上
                i=k;//i发生变化,即调整后面的子孙节点
            }else{
                break;//因为是从下往上,右往左,所以当前根节点已经大于所以子孙节点了
            }
        }
        //最后还原根节点
        arr[i]=temp;
    }


}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值