2016-06-19 8 views
0

Ниже приведена моя программа по созданию мини-кучи с использованием массива 0 со стандартной логикой из книги. Я использую 2*i+1 для левого ребенка и 2*i+2 для правого дочернего элемента, так как он основан на нулевом массиве, но я получаю неправильный вывод. Что мне не хватает?min-heap с нулевым массивом 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; 
} 

ответ

0

Заменено if (right < data_.size() && data_[right] < data_[index]) с

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

что работал, глупую ошибку.