2016-06-19 1 views
0

est mon programme ci-dessous pour construire un tas min en utilisant une matrice basée sur 0 avec logique standard du livre. J'utilise 2*i+1 pour les enfants de gauche et 2*i+2 pour enfant à droite depuis son un tableau basé sur zéro, encore que je reçois une sortie mal. Qu'est-ce que je rate?min tas avec zéro tableau basé sur C++

#include <iostream> 
#include <vector> 
#include <algorithm> 

using std::vector; 
using std::cin; 
using std::cout; 

class HeapBuilder { 
private: 
    vector<int> data_; 

    void WriteResponse() const { 
     for (int i = 0; i < data_.size(); ++i) { 
      cout << data_[i] << "\n"; 
     } 
    } 

    void ReadData() { 
     int n; 
     cin >> n; 
     data_.resize(n); 
     for (int i = 0; i < n; ++i) 
      cin >> data_[i]; 
    } 

    void MinHeapSort(int index) 
    { 
     int left = (2 * index) + 1; 
     int right = (2 * index) + 2; 
     int smallest; 

     if (left < data_.size() && data_[left] < data_[index]) 
      smallest = left; 
     else 
      smallest = index; 

     if (right < data_.size() && data_[right] < data_[index]) 
      smallest = right; 

     if (smallest != index) 
     { 
      swap(data_[smallest], data_[index]); 
      MinHeapSort(smallest); 
     } 
    } 

    void Heapify() {  
     for (int i = (data_.size() - 1)/2; i >= 0; i--) 
     { 
      MinHeapSort(i); 
     } 
    } 

public: 
    void Solve() { 
     ReadData(); 
     Heapify(); 
     WriteResponse(); 
    } 
}; 

int main() { 
    std::ios_base::sync_with_stdio(false); 
    HeapBuilder heap_builder; 
    heap_builder.Solve(); 
    return 0; 
} 

Répondre

0

Remplacée if (right < data_.size() && data_[right] < data_[index]) avec

if (right < data_.size() && data_[right] < data_[smallest]) 

Cela a fonctionné, erreur stupide.