min heap
データ構造を実装するために次のプログラムを書きましたが、期待される出力が得られません。C++の出力順序
#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
私はコメント行で行ったように私は、(別のラインでそれらを印刷するとき、私は、期待される出力を得ることがメインのreturn 0
以上)。
私はあまりにも些細なことを逃した場合は申し訳ありません。
はまた、(例えば[ 'のstd :: make_heap']として、標準ライブラリはすでにヒープを管理するためのいくつかの機能を持っていることに注意してくださいhttp://en.cppreference.com/w/cpp/algorithm/make_heap )。 – Holt
ありがとうございます。それは、 'Min Heap'のために使うライブラリである' Max Heap'を構築していると言います(あるいは適切な 'comp'関数を引数として与えるだけですか?)。 – shiva
適切な 'comp'(例えば、' std :: greater ')を提供するだけです。 –
Holt