堆排序-Java实现

堆排序思想

对于给定的n个数据,初始时将n维数组看成一颗二叉树,若需要从小到大排序,将其调整为小顶堆(若从大到小排序,调整为大顶堆),输出堆顶元素,然后将堆的最后一个元素与堆顶元素(二叉树的根节点)互换,再接着将前n-1个元素(不包括最小数)重新调整为一个最小堆,再次交换堆顶与当前堆的最后一个元素,直到当前堆中只剩最后一个元素为止。程序的输出即为从小到大排序的数列。

Java实现

public class Main {
    public static void main(String[] args) {
        int[] a = {5,4,9,8,7,6,0,1,3,2};
        int len = a.length;
        MinHeapSort(a, len);
    }

    public static void adjustMinHeap(int[] a, int pos, int len){
        int child, temp;
        for(temp = a[pos]; (2*pos+1)<=len; pos = child){
            child = 2*pos + 1;
            if(child<len && a[child]>a[child+1])  // 有右子节点
                child++;
            if(a[child]<temp)
                a[pos] = a[child];
            else
                break;
        }
        a[pos] = temp;
    }

    public static void MinHeapSort(int[] a, int len){
        int i;
        for(i=(len-1)/2;i>=0;i--)   // 调整至小顶堆,从最后一个有孩子的结点开始往上调整
            adjustMinHeap(a, i, len-1);
        for(i=len-1;i>=0;i--){
            System.out.println(a[0]);
            swap(a, 0, i);
            adjustMinHeap(a, 0, i-1); // 调整小顶堆
        }
    }

    public static void swap(int[] a, int i, int j){
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

输出

0
1
2
3
4
5
6
7
8
9
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值