最小堆删除最小乱序

Min Heap Delete Min out of order?

本文关键字:删除      更新时间:2023-10-16

对不起,这里是初学者。我在网上找到了一个最小堆实现,并把它放到了我的加权图中。

class Heap : public weightedGraph
{
public: Heap();
    ~Heap();
    void insert(double element);
    double deletemin()
    {
        double min = heap.front();
        heap[0] = heap.at(heap.size()-1);
        heap.pop_back();
        heapifydown(0);
        return min;
    };
    void print();   
    int size()
    {return heap.size();}

private:
 int left(int parent);
 int right(int parent);
 int parent(int child);
 void heapifyup(int index);
 void heapifydown(int index);
private:
 vector<double> heap;
};
Heap::Heap() {}
Heap::~Heap()
void Heap::insert(double element)
{
   heap.push_back(element);
   heapifyup(heap.size()-1);
}
void Heap::heapifyup(int index)
{
 while((index>0) && (parent(index) >=0) && (heap[parent(index)] > heap[index]))
 {
     double tmp = heap[parent(index)];
     heap[parent(index)] = heap[index];
     heap[index] = tmp;
     index = parent(index);
 }
}
void Heap::heapifydown(int index)
{
 int child = left(index);
 if((child > 0) && (right(index) > 0) && (heap[child]>heap[right(index)]))
 {
     child = right(index);
 }
 if(child > 0)
 {
    double tmp = heap[index];
    heap[index] = heap[child];
    heap[child] = tmp;
    heapifydown(child);
 }
}
int Heap::left(int parent)
{
 int i = ( parent <<1) + 1; 
 return(i<heap.size()) ? i : - 1;
}
int Heap::right(int parent)
{
 int i = ( parent <<1) + 2; 
 return(i<heap.size()) ? i : - 1;
}
int Heap::parent(int child)
{
 if(child != 0)
 {
     int i = (child - 1) >>1;
     return i;
 }
 return -1;
}

当我添加了所有的顶点后,当我运行deletemin直到堆为空,但是有些顶点没有按顺序排列。

411532882924917781842186929953035390246644827543654475705633468687711872389429040974198949961114781153811942123161238212859146041477115141157241703517421176731846719264年187161916919718199122172622190226482328123811244642566720037年262992650025547年 16827 269622764419895年2814527529年282532870329358301063033331322323913266232757

可能还有其他的。有什么原因吗?

检查heapifydown逻辑。你不是在比较父母的体重和孩子的体重你只是在盲目地交换。你只是在比较孩子们的体重。