1. 程式人生 > >演算法導論堆排序虛擬碼(學習筆記)

演算法導論堆排序虛擬碼(學習筆記)

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)