我编写了以下程序来实现min heap
数据结构,但没有得到预期的输出。
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
class MinHeap
{
vector<int> heap;
int size;
public:
MinHeap()
{
//cout<<"asc";
size=0;
}
void insert(int n);
void heapify(int i);
int extract_min();
int get_size()
{
return size;
}
};
void MinHeap::insert(int n)
{
int i=size, parent;
parent=(i-1)/2;
heap.push_back(n);
size++;
while(i>0)
{
if(heap[i]<heap[parent])
{
swap(heap[i], heap[parent]);
}
else
break;
i=parent;
parent=(i-1)/2;
}
}
void MinHeap::heapify(int i)
{
int left=2*i+1, right=2*i+2, min_index=i;
if(left<size && heap[left]<heap[min_index])
min_index=left;
if(right<size && heap[right]<heap[min_index])
min_index=right;
if(min_index!=i)
{
swap(heap[i], heap[min_index]);
heapify(min_index);
}
}
int MinHeap::extract_min()
{
int i=size-1, temp;
if(i>=0)
{
temp=heap[0];
heap[0]=heap[i];
size--;
heapify(0);
}
return temp;
}
int main()
{
int n, i, last=0, val, j;
MinHeap h;
h.insert(10);
h.insert(5);
h.insert(7);
h.insert(1);
cout<<h.extract_min()<<" "<<h.extract_min()<<" "<<h.extract_min()<<" "<<h.extract_min();
// cout<<h.extract_min()<<"\n";
// cout<<h.extract_min()<<"\n";
return 0;
}
输出: 10 7 5 1
预期输出: 1 5 7 10
然而,当我在不同的行中打印它时,我得到了预期的输出(正如我在注释行中所做的那样,在main的return 0
之上)。
很抱歉,如果我错过了一些过于琐碎的事情。
答案 0 :(得分:4)
h.extract_min()
显然会更改变量h
。所以,在这里你可以在一个语句中对同一个变量进行多次更改。不幸的是,C ++标准没有在语句中指定执行顺序,因此,对h.extract_min()
的不同调用不一定以从左到右的方式执行(事实上,你有从右到左的顺序,但它是只是运气)。
要获得正确的输出和可读代码,请考虑使用循环:
for (int i = 0; i < 4; ++i) {
cout << h.extract_min() << ' ';
}
答案 1 :(得分:0)
几乎所有C ++运算符的操作数的评估顺序(包括函数调用表达式中函数参数的评估顺序以及任何表达式中子表达式的评估顺序)都未指定。编译器可以按任何顺序计算操作数,并且可以在再次计算同一表达式时选择另一个顺序。