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)