Heapify:
基本思想:將一個完全二叉樹所有的葉子節點先分別都視爲一個最大堆,然後對第一個非葉子結點進行shiftDown操作,使得該節點和它的葉子節點構成一個最大堆。依次對第二、三個非葉子節點進行同樣的操作,直到整個堆變成一個最大堆。
對於一個完全二叉樹,第一個非葉子節點的索引是完全二叉樹的元素個數除2得到的值。
具體實現:
添加新的公有構造函數
MaxHeap(Item arr[], int n){
data = new Item[n+1];
capacity = n;
for( int i = 0 ; i < n ; i ++ )
data[i+1] = arr[i];
count = n;
for( int i = count/2 ; i >= 1 ; i -- )
shiftDown(i);
}
第二種堆排序:
template<typename T>
void heapSort2(T arr[],int n){
MaxHeap<T>maxheap=MaxHeap<T>(arr,n);
//倒序賦值
for(int i=n-1;i>=0;i--)
arr[i]=maxheap.extractMax();
}
注:
將n個元素逐個插入到一個空堆中,算法複雜度是O(nlogn)
heapify的過程,算法複雜度是O(n)