基于java的二叉树堆排序的实现

思路分析

在这里插入图片描述

package com.shujujiegou;


import java.util.Arrays;

public class ran {

    public static void main(String[] args) {

        //要求升序排列
        int arr[]={4,6,8,5,9};
        duipaixu(arr);


    }

    //编写一个堆排序的方法
    public static void duipaixu(int arr[]){
        int temp=0;
        System.out.println("堆排序");

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

        //交换元素,使最大元素到最后
        //重新调整结构,使其满足堆定义,
        for(int j=arr.length-1;j>0;j--){
            //交换
            temp=arr[j];
            arr[j]=arr[0];
            arr[0]=temp;
            dadingdui(arr,0,j);
        }



        System.out.println("shuzu="+Arrays.toString(arr));
    }

    //将一个数组(二叉树)调整成一个大顶堆,i表示非叶子节点在数组中的索引,length表示对多少个元素进行调整,是在逐渐减少
    //将以i为非叶子节点的树调整成大堆栈 比方说i=1的时候  46859->49856
    //如果我们再次调用,就应该传入i=0  49856->96854
    public static  void dadingdui(int arr[],int i,int length){
        int temp=arr[i]; //先取出当前元素的值保存在临时变量
        //开始调整
        for (int k=i*2+1;k<length;k=k*2+1){
            if(k+1<length && arr[k]<arr[k+1]) {
                //左子节点小于右子节点
                k++;
            }
            if(arr[k]>temp){
                //如果子节点大于父节点
                arr[i]=arr[k]; //吧较大的值赋给当前节点
                i=k; //让i指向k,继续循环比较
            }else {
                break;
            }
        }
        //当for循环结束后,我们已经将以i为父节点的树的最大值放在了堆顶(局部)
        arr[i]=temp;//将temp值放到调整后的位置
    }


}



//创建双向链表
class HeroNode{
    public int no;
    public HeroNode next;

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public HeroNode getNext() {
        return next;
    }

    public void setNext(HeroNode next) {
        this.next = next;
    }

    public HeroNode(int no) {
        this.no = no;
    }
}

代码实现效果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值