JAVA实现堆排序

堆排序强烈推荐这篇文章堆排序详解 - 前程明亮 - 博客园 !!

文中的堆排序用的是python实现的(循环遍历),我自己用JAVA实现了一下(循环,递归),特此记录。

为了方便阅读和使用,代码用了很多变量,看着略显繁琐,其实贼简单

核心思路:调整得到大顶堆,交换堆顶和堆底

核心数据结构:完全二叉树

核心操作:父节点和左右子节点的调整,得到大顶

核心函数:adjust,调整三元组,调整完后递归调整可能不满足父节点最大的三元组

核心代码其实不到十行

具体代码:

二叉树类

public class HeapSort {
    void sort(int[] arr) {
        int cur = arr.length - 1;
        createBigHeap(arr);
        while(cur > 0) {
            swap(arr, cur--, 0);
            adjust(arr, 0, cur);
        }
    }

    void createBigHeap(int[] arr) {
        for (int i = 0; i < (arr.length + 1) / 2; i++) {
            adjust(arr, i, arr.length - 1);
        }
    }

    void adjust(int[] arr, int i, int n) {
        int lc = 2 * i + 1;
        if (lc > n) return;
        int rc = lc + 1;
        if (rc > n) {
            if (arr[lc] > arr[i]) {
                swap(arr, lc, i);
                if (i != 0) {
                    adjust(arr, (i -1)/2, n);
                }
            }
        } else {
            if (arr[i] >= arr[lc] && arr[i] >= arr[rc]) return;
            if (arr[lc] > arr[rc]) {
                swap(arr, lc, i);
                if (i != 0) {
                    adjust(arr, (i -1)/2, n);
                }
                adjust(arr, lc, n);
            } else {
                swap(arr, rc, i);
                if (i != 0) {
                    adjust(arr, (i -1)/2, n);
                }
                adjust(arr, rc, n);
            }
        }
    }

    void swap(int[] arr, int x, int y) {
        int tmp = arr[y];
        arr[y] = arr[x];
        arr[x] = tmp;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值