2016-12-19 73 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

還要注意的是標準庫中已經有一些功能來管理堆,如['標準:: make_heap'(http://en.cppreference.com/w/cpp/algorithm/make_heap )。 – Holt

+0

謝謝。它說它構造了'Max Heap',該庫用於'Min Heap'(或者我應該提供合適的'comp'函數作爲參數)? – shiva

+0

你應該提供一個合適的'comp'(例如'std :: greater ')。 – Holt

回答

4

h.extract_min()明顯改變變量h。所以,在這裏你有一個語句中的同一個變量的多個變化。不幸的是,C++標準沒有在語句中指定執行順序,因此,對於h.extract_min()的不同調用不一定以從左到右的方式執行(實際上,您有從右到左的順序,但它只是運氣)。

爲了具有正確的輸出和可讀的代碼,可以考慮使用循環:

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

由此:'C++標準沒有在語句中指定執行順序,您是否指'cout'中的語句? – shiva

+0

@shiva是的。 ''h.extract_min()<<「」h.extract_min()<<「」<< h.extract_min()<<「」<< h.extract_min()'是一個語句,其中包含多個函數調用和他們之間的幾個'<<'運算符。所有函數調用都可以按任意順序執行。 – alexeykuzmin0

0

幾乎所有的C++運算符(包括函數參數評價的一個函數調用表達式中的順序的操作數的計算順序和在任何表達式中對子表達的評估順序)是未指定的。編譯器可以按任何順序評估操作數,並且可以在再次評估同一個表達式時選擇另一個順序。

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