Star pop(Heap *hp) { Star star = hp ->arr[0]; swap(hp,0,hp ->length -1); hp ->length = hp ->length -1; filterDown(hp,0); return star; }
void heapSort(std::vector<Type> &v, std::function<bool (const Type &lhs, const Type &rhs)> cmpFn) { // first heapify heapify(v, cmpFn); // remove from the heap, filterDown the root for (int i = static_cast<int>(v.size()) - 1; i >= 1; --i) { h_swap(v, 0, i); filterDown(v, i, 0, cmpFn); } }
void update(Heap *hp,Star star) { for (int i=0;i< hp->length;i++){ if (star.x == hp->arr[i].x && star.y == hp->arr[i].y) { hp->arr[i].g = star.g; hp->arr[i].h = star.h; int f = hp->arr[i].f; hp->arr[i].f = star.f; if (f < star.f){ filterDown(hp,i); }else{ filterUp(hp,i); } //break; } } }
void filterDown(Heap *hp, int node) { int l = leftChild(node); int r = rightChild(node); int largest = 0; int heapMaxI = hp -> length - 1; if (l <= heapMaxI && hp ->func(hp ->arr[l],hp ->arr[node])) largest = l; else largest = node; if (r <= heapMaxI && hp ->func(hp ->arr[r],hp ->arr[largest])) largest = r; if (largest != node) { swap(hp,largest,node); filterDown(hp,largest); }else{ return; } }
void heapify(std::vector<Type> &v, std::function<bool (const Type &lhs, const Type &rhs)> cmpFn) { if (v.size() <= 1) return; for (int lp = static_cast<int>(lastParent(v.size())); lp >= 0; --lp) filterDown(v, v.size(), lp, cmpFn); }