美文网首页
大根堆以及堆排序

大根堆以及堆排序

作者: 墨_0b54 | 来源:发表于2021-10-27 21:03 被阅读0次

直接上代码

private static void sortMaxHeap(int[] arr) {//大根堆排序
    if (arr==null || arr.length < 2) {
        return;
    }
    buildMaxHeap(arr);
    for (int i = arr.length - 1; i >= 0; i--) {
        swap(arr, 0, i); //将最大根换到最后
        adjustMaxHeap(arr, i, 0); //调整大根堆,除了最后已经排好序的元素
    }
}

private static void buildMaxHeap(int[] arr) {//构造一个大根堆
    if (arr==null || arr.length < 2) {
        return;
    }
    for (int i = arr.length/2 - 1; i >= 0; i--) {//从所有叶子节点的父节点开始调整
        adjustMaxHeap(arr, arr.length, i);
    }
}

private static void adjustMaxHeap(int[] arr, int size, int i) {//调整索引为i的子树,使子树是一个大顶堆。
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    int max = i; //最大值的索引,默认为父节点
    if (left < size && arr[left] > arr[max]) { //左子节点与父节点比大小
        max = left;
    }
    if (right < size && arr[right] > arr[max]) { //右子节点与父节点比大小
        max = right;
    }
    if (max != i) { //最大点是子节点
        swap(arr, max, i); //与子节点交换位置
        adjustMaxHeap(arr, size, max); //因为子节点发生了改变,要调整子节点
    }
}

private static void swap(int[] arr, int i, int j) {
    int t = arr[i];
    arr[i] = arr[j];
    arr[j] = t;
}

public static void main(String[] args) {
    int[] arr = new int[]{1,22,55,88,44,996,44,66,15,700};
    buildMaxHeap(arr);//结果[996, 700, 55, 88, 44, 1, 44, 66, 15, 22]
    System.out.println("arr = " + Arrays.toString(arr));
    sortMaxHeap(arr);//结果[1, 15, 22, 44, 44, 55, 66, 88, 700, 996]
    System.out.println("arr = " + Arrays.toString(arr));
}
  • 首先去了解二叉树,然后想象数组也可以是一个二叉树。
  • 假设索引0是根节点,左子节点是索引1,右子节点是索引2
  • 索引1的左子节点是索引3,右子节点是索引4;索引2的左子节点是索引5,右子节点是索引6
  • 以此类推,如果根节点是索引n,那么左子节点的索引是2*n+1,右子节点是2*n+2
  • 这时我们有了一个堆了,而大根堆就是子树的根都是树中的最大值
    一张图可以更好理解大根堆:


    大根堆示意图.png
  • 再来说堆排序,假如此时我们已经有了一个大根堆了,那么我们把根与堆的最后一个节点进行交换,如上图209交换
  • 确定了最后一个索引位的值,然后将3之前的节点调整为新的大根堆,就又得到了一个大根堆,与第一步同理
  • 以此类推,最后就得到一个排好序的数组

相关文章

  • 大根堆以及堆排序

    直接上代码 首先去了解二叉树,然后想象数组也可以是一个二叉树。 假设索引0是根节点,左子节点是索引1,右子节点是索...

  • 前端-堆排序 (选择排序)

    堆排序小根堆: L[i] <= L[2i] && L[i] <= L[2i + 1]大根堆: L[i] >= L[...

  • 堆排序

    堆排序的思路是先要建立堆大根堆:所有父节点比子节点要大小跟堆:所有父节点比子节点小 升序排序先建立大根堆,建立好后...

  • 堆排序

    堆排序过程图示 大根堆 除了根节点以外的所有节点都要满足A[parent(i)] >= A[i]二叉堆是一个数组,...

  • java实现堆排序(大根堆)

    堆的概念 1.堆分为大根堆(父节点最大)和小根堆(父节点最小)2.堆是完全二叉树3.完全二叉树是满二叉树或者上面的...

  • 堆以及堆排序

    堆的定义,以大顶堆为例,需要满足两个条件: 堆是一颗完全二叉树 堆的每一个节点的值都必须大于等于其子树中每个节点的...

  • 二叉树的应用

    1 排序二叉树和堆 用途树结构关系存储方式应用(大根)堆排序完全二叉树根>左子树,根>右子树数组堆排序,取topk...

  • 排序算法

    堆排序 时间复杂度:Ο(nlogn)空间复杂度:一个辅助空间稳定性:不稳定排序(升序用大根堆,降序就用小根堆): ...

  • 说说算法那些事-堆排序

    堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。堆分为大根堆和...

  • 【算法】排序(六)堆排序

    正文之前 这一篇文章介绍一下堆的概念,以及堆排序 基本概念、最大/最小堆堆排序分析 正文 1. 什么是堆 堆不是单...

网友评论

      本文标题:大根堆以及堆排序

      本文链接:https://www.haomeiwen.com/subject/jcnpaltx.html