迭代实现堆排序-Java代码

public class Heap {
    public static void main(String[] args) {
        int a[] = new int[]{5,6,8,4,2,3};
        headsort(a);
    }
    public static void Buidheap(int a[],int len){
//        i=0-【len/2】 二叉树的非叶子节点进行堆的调整
        for (int i = len/2; i >= 0; i--) {
            heapfy(a,i,len);
        }
    }
    public static void heapfy(int a[],int k,int len){
        int temp = a[k];//temp存放子树的根节点
        //调整k节点为根的子树
        for (int i = 2 * k+1; i < len ; i = i * 2 + 1 ) {
            if(i < len-1 && a[i] < a[i+1]){
                i++;//记录左右左孩子中最大数所在的节点位置
            }
            if(a[i] <= temp){//根节点最大,不用调整了
                break;
            }
            else {//孩子的值比根节点的大,最大的孩子放到根节点
                a[k]=a[i];
                k=i;//对最大的孩子为根节点的子树进行调整
            }
        a[k]=temp;//确定根节点数据最终该放置的位置
        }
    }
public static void headsort(int a[]){
    int len = a.length;
    Buidheap(a,len);//建堆
    int temp=0;
    //将跟堆进行排序
    for (int i = len; i > 1; i--) {
        temp = a[0];
        a[0] = a[i-1];
        a[i-1] = temp;
        heapfy(a,0,i-1);
    }
    //输出数组数据
    for (int i = 0; i < a.length; i++) {
        System.out.print(a[i]+" ");
    }
}

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值