算法导论堆排序伪代码(学习笔记)

MAX-HEAPIFY 递归伪代码:   时间复杂度为 lg(n) 底数为2 , 维护最大堆性质的关键

MAX-HEAPIFY(A, i):        //维护堆性质的关键, 用于检测是否满足堆的性质
    l = left(i);
    r = right(i);   //记录左右孩子的下标
    if l <=  A.heap-size and A[l] >= A[i]:
        largest = l;    //记录根节点和左右孩子中最大数的下标
    else :
        largest = r;
    
    if r <= A.heap-size and r >= A[largest]:
        largest = r;
    
    if i != largest:
        exchange A[i] and A[largest];
        MAX-HEAPIFY (A, largest);

MAX-HEAPIFY     迭代伪代码,   因为递归代码可能在某些机器上会生成效率低的代码, 所以用循环改进

MAX-HEAPIFY(A, i):
    while i<=heap-size:
        l = left(i);     //记录下标为i的结点的左孩子的下标
        r = right(i);    //记录下标为i的结点的右孩子的下标
        if r <= heap-size and A[r] >= A[i]:
            largest = r;
        else :
            largest = i;
        if l <= heap-size and A[l] >= A[largest]:
            largest = l;
        if largest == i:
            break;
        else :
            exchange arr[i] and arr[largest];

 

BUILD-MAX-HEAP 伪代码如下, 通过对有孩子的所有结点包括根结点都调用 维护堆性质的方法 MAX-HEAPIFY:

BUILD-MAX-HEAP(A):
    A.heap-size = A.length;
    //heap-size代表整个数组中在堆中的元素个数
    for i = A.length/2 downto 1:
        MAX-HEAPIFY(i)

BUILD-MAX-HEAP 时间复杂度: T(n) = O(n)

 

HEAP-SORT  伪代码如下:

    通过交换堆中的最后一个元素和堆顶元素的值,并且保证新的堆中的元素满足最大堆,重复操作, 知道堆中只有一个堆顶元素为止,则整个数组升序排列

HEAP-SORT(A):
    BUILD-MAX-HEAP(A);     //构建最大堆
    for i = A.length downto 2:
        exchange A[i] and A[1];
        A.heap-size = A.heap-size-1;
        MAX-HEAPIFY(i);

HEAP-SORT 时间复杂度为:T(n) = O(nlgn)

    原文作者:ThinkKite
    原文地址: https://blog.csdn.net/thing15636/article/details/83021517
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞