堆排序(JAVA实现大顶堆-升序)

堆排序满足完全二叉树的特性

若一棵二叉树至多只有最下面两层的结点的度数可以小于2,并且最下层的结点都集中在该层最左边的若干位置上,则此二叉树为完全二叉树。

class Heapsort{
    int tem=0;
    //函数结束完成以结点i为顶点的大顶堆
    public void adjustnode(int []arr,int i,int length)
    {
        int tem=arr[i];
        for(int k=2*i+1;k<length;k=2*i+1)
        {
            if((k+1)<length&&arr[k+1]>arr[k]) k++;//如果右子节点大于左子结点,指向右结点
            if(arr[k]>tem)
            {
                arr[i]=arr[k]; //每次for循环都将节点i的左子结点和右子节点的最大值赋给结点i
                i=k;
                //下一次循环是节点是结点i的子结点所以i=k
                //每次循环不知道下次是左结点还是右结点,则必须保证没有访问的子树为大堆序
            }
            else
                break;

        }

        arr[i]=tem;
        //将最大值赋值给传进来的节点
    }
    public void heapsort(int arr[]){
        for(int j=arr.length/2-1;j>=0;j--)
        {
            adjustnode(arr,j,arr.length);
        }
        System.out.println(Arrays.toString(arr));
        //arr.length/2为最后叶子结点序号,递减到根节点
        //非叶子结点查找方向:从右到左,从下往上
        //此函数是将整个数组成为大堆序
        //adjustnode(arr,0,arr.length);

        for(int j=arr.length-1;j>=0;j--)
        {
            tem=arr[j];
            arr[j]=arr[0];
            arr[0]=tem;
            adjustnode(arr,0,j);
            //传入长度j理解为需要排序的元素个数,即下标最大值
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值