2016-12-19 1 views
1

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 이상).

만약 내가 너무 사소한 것을 놓친다면 미안.

+2

또한 http://en.cppreference.com/w/cpp/algorithm/make_heap (표준 라이브러리는 이미 ['표준 : make_heap']로 힙을 관리 할 수있는 몇 가지 기능을 가지고 있습니다). – Holt

+0

감사합니다. 그것은 'Min Heap'에 사용할 라이브러리 인 Max Heap을 구성한다고합니다 (또는 적절한'comp' 함수를 인수로 제공해야합니까?). – shiva

+0

적절한 'comp'를 제공해야합니다 (예 :'std :: greater '). – Holt

답변

4

h.extract_min()은 분명히 변수 h을 변경합니다. 그래서 여기에서 한 문장 내에서 동일한 변수에 대해 여러 변경 사항이 있습니다. 아쉽게도 C++ 표준에서는 명령문에서 실행 순서를 지정하지 않으므로 h.extract_min()에 대한 다른 호출이 반드시 왼쪽에서 오른쪽 방향으로 실행되지는 않습니다 (사실, 오른쪽에서 왼쪽 순서이지만 실제로는 운이 좋음).

는, 올바른 출력 및 읽을 수있는 코드가 루프를 사용하는 것을 고려 : 함수 호출 식의 함수 인자의 평가 순서를 포함하여 거의 모든 C++ 사업자 (의 피연산자의 평가

for (int i = 0; i < 4; ++i) { 
    cout << h.extract_min() << ' '; 
} 
+0

이것은 :'C++ 표준은 명령문에서 실행 순서를 지정하지 않습니다.''cout' 내의 명령문을 의미합니까? – shiva

+0

@shiva 예. '<< h.extract_min()'은 여러 함수 호출을 포함하는 명령문입니다. 그들 사이에 여러 개의'<< "연산자가있다. 모든 함수 호출은 임의의 순서로 실행될 수 있습니다. – alexeykuzmin0

0

주문을하고 임의의 표현식 내의 서브 표현식의 평가 순서)는 명시되지 않았다. 컴파일러는 모든 순서로 피연산자를 계산할 수 있으며 동일한 표현식이 다시 계산 될 때 다른 순서를 선택할 수 있습니다.

http://en.cppreference.com/w/cpp/language/eval_order