我正在尝试创建一个最大堆,逻辑很简单,如果父级小于它的一个子级,则交换它们。我尝试使用
实现它void maxHeapify( int i , int *a , int n ){
int largest = i;
int left = ( i * 2 ) + 1;
int right = ( i * 2 ) + 2;
if( left < n && a[ largest] < a[ left ])
largest = left;
if( right < n && a[ largest ] < a[right])
largest = right;
if( largest != i ){
swap( a[i], a[largest]);
maxHeapify( largest , a, n );
}
}
int main(){
int n;
int * a;
cout << "Number of elements : ";
cin >> n ;
a = new int[n];
for( int i = 0; i < n ; i++){
cin >> a[i];
}
for( int i = n/2 -1 ; i >= 0 ; i-- ){
maxHeapify( i , a, n);
}
for(int i = 0; i < n ; i++){
cout << a[i] << " ";
}
return 0;
}
我正在使用输入
2 7 26 25 19 17 1 90 3 36
树看起来像
90 36 17 25 26 7 1 2 3 19
所以数组表示应该是90 36 17 25 26 7 1 2 3 19
然而代码的输出是
90 36 26 25 19 17 1 7 3 2
我查了一下,在许多教程中发现了许多相同的代码。为什么输出不是数组中树的表示?我误解了吗?
感谢您的解释
答案 0 :(得分:0)
为什么您希望堆以特定方式查看?可以通过多种方式将这些输入数字排列到堆中。您获得的结果也是一个有效的堆 - 每个父级都比它的子级大:
90
36 26
25 19 17 1
7 3 2
答案 1 :(得分:0)
最终堆结构将根据插入顺序和初始结构而变化。在您的情况下,2 7 26 25 19 17 1 90 3 36
将产生您期望的结果,如果您开始使用空堆,按给定顺序插入元素并在每次插入后堆积。
此代码将产生您期望的结果:
std::vector<int> b = {2, 7, 26, 25, 19, 17, 1, 90, 3, 36};
auto it = b.begin();
while (it != b.end())
{
std::make_heap(b.begin(), it+1);
++it;
}
但是,你的代码所做的是将所有元素预插入堆中,然后排列它,相当于:
std::vector<int> b = {2, 7, 26, 25, 19, 17, 1, 90, 3, 36};
std::make_heap(b.begin(), b.end());
两种结果都同样有效。