void MaxHeapIFY(int a[], int node, int length) { int largest; int temp; int l = leftChild(node); int r = rightChild(node); if(l < length && a[l] > a[node]) { largest = l; } else { largest = node; } if(r < length && a[r] > a[largest]) { largest = r; } if( node != largest) { temp = a[node]; a[node] = a[largest]; a[largest] = temp; MaxHeapIFY(a, largest, length); } }
//Build max-heap: void BuildMaxHeap(int a[], int length) { int i; for(i = (length - 1)/2; i >= 0; i--) { MaxHeapIFY(a, i, length); } }
//Heap sort: void HeapSort(int a[], int length) { int i; int temp; BuildMaxHeap(a, length); for(i = length - 1; i > 0; i--) { temp = a[i]; a[i] = a[0]; a[0] = temp; MaxHeapIFY(a, 0, i); } }
void MaxHeap::MaxHeapIFY(int i) { int l=Left(i); int r=Right(i); int largest; if((l<=this->list.length())&&((r<=this->list.length()))&& (this->list.at(l-1)>this->list.at(i-1))&&(this->list.at(l-1)>this->list.at(r-1))){ this->list.swap(l-1,i-1); largest=l; }else if((r<=this->list.length())&&(l<=this->list.length())&& (this->list.at(r-1)>this->list.at(i-1))&&(this->list.at(r-1)>this->list.at(l-1))){ this->list.swap(r-1,i-1); largest=r; } else{ largest=i; } if(largest!=i&&largest<=this->list.length()) MaxHeapIFY(largest); }
void MaxHeap::BuildMaxHeap() { for(int i=this->list.length()/2;i>0;i--){ MaxHeapIFY(i); } }