堆排序Java实现

什么是堆呢?

首先是一棵完全二叉树(叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树)
然后父节点的值都要大于子节点

我们的目的很简单 首先要构造一个堆


```java
//n是树里面有多少结点  i表示我们要做heapify操作的节点
public void heapify(int[] tree, int n, int i) {
    if (i >= n) {
        return;
    }
    int c1 = 2 * i + 1;
    int c2 = 2 * i + 2;
    int max = i;
    //至此得到了三个节点 max是假设的 现在要在三个节点里面找最大值
    if (c1 < n && tree[c1] > tree[max]) {
        max = c1;
    }
    if (c2 < n && tree[c2] > tree[max]) {
        max = c2;
    }
    //至此找到了最大值 只是找到了 现在开始交换
    if (max != i) {
        swap(tree, max, i);
        //交换完之后还满足吗 所以递归
        heapify(tree, n, max);
    }

}

public void build_heap(int[] tree, int n) {
    int last_node = n - 1;
    int parent = (last_node - 1) / 2;
    for (int i = parent; i >= 0; i--) {
        heapify(tree, n, i);
    }
}

public void heap_sort(int tree[], int n) {
    build_heap(tree, n);
    for (int i = n - 1; i >= 0; i--) {
        swap(tree, i, 0);//堆的首尾交换
        heapify(tree, i, 0);
    }
}

private void swap(int[] tree, int max, int i) {
    int temp = tree[max];
    tree[max] = tree[i];
    tree[i] = temp;
}

``个人感觉这种方式要透彻很多 基本不需要注释 很清晰

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值