堆排序

堆排序
1.建堆
2.排序
3.调整


public class HeapSort{
    public void buildHeap(int [] a){
        for (int i=(a.length-2)/2;i>=0;i--){//从叶子节点开始建堆,使得每一颗子树都是大根堆
            adjust(a,i,a.length);
        }
    }
//调整使得大的元素在上层
    private void adjust(int[] a, int i, int i1) {
        int temp=a[i];//保存当前的根节点元素
        for (int k=i*2+1;k<i1;k=k*2+1){//如果根节点没有子节点就返回,否则找到两个根节点中较大的元素,
            //将根节点和大元素交换,并将子节点作为新的根节点,调整该节点使其成为大根堆
            if (k+1<i1&&a[k]<a[k+1])k++;
            if (temp>=a[k])break;
            else{
                a[i]=a[k];
                i=k;
            }
        }
        //调整完毕则最后一个调整的节点继承最开始根节点的值
        a[i]=temp;
    }
    public void sort(int []a){
        buildHeap(a);//建立大根堆
        for (int i=a.length-1;i>0;i--){
        int temp=a[0];//将根元素和末尾元素交换,相当于出队
        a[0]=a[i];
        a[i]=temp;
        adjust(a,0,i);//最大元素出队后重新建堆
    }
    }

    public static void main(String[] args) {
        int a[]={0,1,2,3,4,5,6,7,8,9 };
        HeapSort hs=new HeapSort();
        hs.sort(a);
        for (int i=a.length-1;i>=0;i--
             ) {
            System.out.print(a[i]+" ");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值