堆排序(Java)



public class Sort {


    //数组申请过大,会出java.lang.OutOfMemoryError
    int[] a = {10, 1, 35, 61, 89, 36, 55};

    //输出数组
    void showArr(int[] a) {
        for (int i = 0; i < a.length; i++) {
            System.out.printf("%d ", a[i]);
        }
        System.out.println();
    }

    //交换函数
    void swap(int[] a, int i, int j) {
        int t;
        t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
    /*
    堆排序
    一种选择排序
    大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
    步骤:
    1. 创建一个堆h[0...n-1]
    2. 把堆首(最大值)和堆尾交换
    3, 把堆尺寸缩小1
    4. 重复步骤,直到堆的大小为1
     */

    //全局变量,记录当前堆的长度
    int len;

    //建立大顶堆
    void buildMaxHeap(int[] a) {
        //初始化len
        len = a.length;
        //length/2-1正好是完全二叉树最后一个结点的父节点,前提是数组下标为0
        for (int i = a.length/ 2-1; i >= 0; i--) {
            //自下而上,使每个非叶子结点都是大顶堆
            heapify(a, i);
        }
    }

    //调整从第i个结点为父节点的完全二叉树为大顶堆
    void heapify(int[] a, int i) {
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        int largest = i;
        if (left < len && a[left] > a[largest])
            largest = left;
        if (right < len && a[right] > a[largest])
            largest = right;
        if (largest != i) {
            swap(a, i, largest);
            heapify(a, largest);
        }
    }

    void HeapSort(int[] a) {
        buildMaxHeap(a);
        for (int i = a.length - 1; i > 0; i--) {
            //把当前最大值放到数组最后
            swap(a, 0, i);
            //减小数组长度
            len--;
            //调整交换后的堆
            heapify(a, 0);
        }
    }

    public static void main(String[] args) {
        Sort sort = new Sort();
        sort.HeapSort(sort.a);
        sort.showArr(sort.a);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值