演算法導論堆排序虛擬碼(學習筆記)
阿新 • • 發佈:2018-12-14
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)