堆排序

堆排序


package com.buaa.algorithm.sort;
/**
 * 堆排序
 * @author lzxyzq
 *
 */
public class d3HeapSorted {
    //节点k进行筛选
    //a:堆数据,n:堆中有效数据个数,k待筛选节点
    static void heapOne(int[]a,int n,int k){
        int k1 = 2*k + 1;
        int k2 = 2*k + 2;
        if(k1>=n&&k2>=n)return;//已经是叶子了

        int a1 = Integer.MAX_VALUE;
        int a2 = Integer.MAX_VALUE;
        if(k1<n) a1 = a[k1];//左孩子值
        if(k2<n) a2 = a[k2];//右孩子值

        if(a[k]<=a1&&a[k]<=a2)return;//符合堆的要求

        //找到左右孩子中最小的,和它交换
        if(a1<a2){
            int t = a[k];
            a[k] = a[k1];
            a[k1] = t;
            heapOne(a,n,k1);
        }else{
            int t = a[k];
            a[k] = a[k2];
            a[k2] = t;
            heapOne(a,n,k2);
        }
    }

    static void heapSort(int[]a)
    {
    //建立初始堆
    for(int i=(a.length-1)/2;i>=0;i--)
        heapOne(a,a.length,i);    
    //边输出堆顶,边调整
    int n = a.length;//剩余元素数
    while(n>0){
        System.out.print(a[0]+" ");//输出堆顶元素
        a[0] = a[n-1];
        n--;
        heapOne(a,n,0);
    }
    System.out.println();
}    
    public static void main(String[] args) {
        int[]a = {12,3,6,8,5,19,20,16,4,2,7,13,9,11};
        heapSort(a);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值