堆排序

二叉堆的定义:二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级储存(不使用数组的第一个元素)。
堆有序:一课二叉树的每个节点都大于等于他的两个子节点
完全二叉树:除了最后一层外的其他每一层都 都被完全填充,最后一层向左对齐。

一图胜千言:

一个二叉堆数组
//这里的数组是从1开始排列的
    public void sort(Comparable[] a) {
        int n = a.length;
        for (int k = n / 2; k >= 1; k--) {
            sink(a, k, n);
        }
        while (n > 1) {
            exch(a, 1, n--);
            sink(a, 1, n);
        }
    }

    private void sink(Comparable[] a, int k, int n) {
        while (2 * k <= n) {
            int j = 2 * k;
            if (j < n && less(a, j, j + 1))
                j++;
            if (!less(a, k, j))
                break;
            exch(a, k, j);
            k = j;
        }
    }

    private boolean less(Comparable[] a, int i, int j) {
        return a[i - 1].compareTo(a[j - 1]) < 0;
    }

    private void exch(Object[] a, int i, int j) {
        Object temp = a[i - 1];
        a[i - 1] = a[j - 1];
        a[j - 1] = temp;
    }

方法解读在优先队列

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 堆排序可以做什么 首先应该弄清楚堆排序可以解决什么问题,答案是显而易见的:排序。说得通俗点儿就是对一组无序的数字进...
    Springlord888阅读 30,523评论 11 52
  • 二叉树 满二叉树 国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,...
    简_爱SimpleLove阅读 9,760评论 0 3
  • 堆排序和快速排序一样也是一个O(n logn)的排序算法 但是二者是不一样的实现原理 [这是肯定的,不要pia我]...
    阿飞不理飞阅读 4,136评论 0 0
  • 上次写到了快排,接着往下讲。O(nlogn)级别的算法除了上次说的快排,归并,还有推排序。今天从先推排序开始写。堆...
    锅与盆阅读 6,440评论 0 2
  • 从前 有一座蓝色的隐山 山上有一座无人教堂 ...
    音你而美漂亮宝贝阅读 3,153评论 0 1

友情链接更多精彩内容