堆调整算法

堆调整算法

思路

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

基本思想

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

效率

时间复杂度: 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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 归去来兮。 1.1 说明 本篇为《挑战程序设计竞赛(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy阅读 14,476评论 0 160
  • 一、直接插入排序 直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的元素记录,按其关键字...
    kevin16929阅读 579评论 0 0
  • 四. 走向世界之巅——快速排序 你可能会以为归并排序是最强的算法了,其实不然。回想一下,归并的时间效率虽然高,但空...
    Leesper阅读 1,784评论 9 7
  • 妈妈开始寻求 生活中更多的方法帮助你。首先我们买回了了几条小金鱼,你好喜欢。只是你喜欢的方式过于特别,你常常忍不住...
    就这样微笑阅读 269评论 0 0
  • 周一学习活法三个小结主要讲述了人的欲望,托儿斯泰的感叹一节中描述了一个人死到临头竟然沉醉于蜜汁之中而不能自拔,这个...
    张伟99阅读 236评论 0 0