堆调整算法

作者: freelamb | 来源:发表于2016-11-28 19:40 被阅读689次

堆调整算法

思路

算法将获取到一组数据的最大值(针对大顶堆)或最小值(针对小顶堆)。

基本思想

通过堆排序的调整算法获取到最大值和最小值。

效率

时间复杂度: o(logn)
空间复杂度: o(1)

应用

  1. 获取最大值或最小值
  2. top K

代码实现

递归实现

// C++
void Swap(int &first, int &second) {
    int temp    = first;
    first       = second;
    second      = temp;
}

// start->index start, end->index end
void AdjustHeap(int array[], int start, int end) {
    int left_child  = start * 2 + 1;
    int right_child = start * 2 + 2;
    int temp        = start;

    if (start <= end / 2) { // not leaf
        // find max(temp, left_child)
        if (left_child < end && array[temp] < array[left_child]) {
            temp    = left_child;
        }
        // find max(temp, right_child)
        if (right_child < end && array[temp] < array[right_child]) {
            temp    = right_child;
        }
        // temp has change, should adjust
        if (temp != start) {
            Swap(array[temp], array[start]);
            AdjustHeap(array, temp, end);
        }
    }
}

非递归实现

// C++
// start->index start, end->index end
void AdjustHeap(int array[], int start, int end) {
    int temp    = array[start];

    for (int index = start * 2 + 1; index <= end; index = index * 2 + 1) {
        // find max(left_child, right_child)
        if (index < end && array[index] < array[index + 1]) {
            index++;
        }
        // find max(child, temp)
        if (temp > array[index]) {
            break;
        }
        // move child to parent
        array[start]    = array[index];
        start           = index;
    }

    array[start] = temp;
}

相关文章

  • 堆调整算法

    堆调整算法 思路 算法将获取到一组数据的最大值(针对大顶堆)或最小值(针对小顶堆)。 基本思想 通过堆排序的调整算...

  • Java虚拟机(JVM)调优

    一、Java内存结构 二、堆内存的构成 三、堆内存参数的调整 四、GC如何确定垃圾 五、垃圾收集算法 六、垃圾收集...

  • 堆算法

    示例代码 结果

  • 堆算法

  • 算法之堆算法

    堆的定义如下:n个元素的序列{k0,k1,...,ki,…,k(n-1)}当且仅当满足下关系时,称之为堆。" ki...

  • 堆排序算法(Java实现)

    原始堆如下: 堆排序算法 构造初始堆,从最后一个非叶节点开始调整选出叶子节点中比自己大的一个交换,如果交换后的叶子...

  • 堆相关算法

    转发 C 堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。...

  • jvm堆参数调整

    堆内存调优: 默认:(个人电脑内存为16G) 参数调优:格式:-Xms1024m -Xmx1024m -XX:+P...

  • 堆调整算法-直接将数组转成最大最小堆

    直接将数组调整成最大或者最小堆 @heapsortbegin():1.将数组转成堆heapify();2.移出根结...

  • heapq : 堆队列算法

    heapq : 堆队列算法 Source code: Lib/heapq.py 介绍 这个模块提供了堆队列算法的实...

网友评论

    本文标题:堆调整算法

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