最大堆未正确创建
Max Heap is not created properly
我写了下面的代码来从一个已经存在的数组中构建一个 maxheap downadjust 函数使数组成为一个最大堆,但它没有产生预期的结果
请检查代码并告诉我我哪里出错了,如果有人建议对 downadjust 函数进行哪些更改将帮助我制作最小堆(这是我必须编写的下一个问题),这将非常有帮助
#include <iostream>
using namespace std;
void downadjust(int heap[],int i){
// n is size
int n=heap[0];
int j,flag=1;
while(2*i<=n && flag==1){
j=2*i;
if(j+1<=n && heap[j+1]>heap[j]){
j=j+1;
}
if(heap[i]>heap[j]) flag=0;
else
{
swap(heap[i],heap[j]);
i=j;
}
}
}
void disp(int heap[],int n){
for(int i=1;i<n;i++){
cout<<heap[i]<<" ";
}
}
int main()
{
int n;
cout<<"no of stud";
cin>>n;
n++;
int heap[n];
heap[0]=n-1;
for(int i=1;i<n;i++){
cin>>heap[i];
}
for(int i=n/2;i>=1;i--){
downadjust(heap,i);
}
disp(heap,n);
cout<<endl;
cout<<"max is "<<heap[1];
return 0;
}
5 1 9 2 11 50 6 100 7
的结果是有效堆 100 11 50 7 5 9 6 2 1
。
也许您想要 50 11
序列和其他有序的子节点对,但堆构造不提供子节点的严格相互排序(如二叉搜索树那样)。
要做minheap,只需要改两个比较:
if (j + 1 <= n && heap[j + 1] < heap[j]) {
j = j + 1;
}
if (heap[i] < heap[j]) flag = 0;
我写了下面的代码来从一个已经存在的数组中构建一个 maxheap downadjust 函数使数组成为一个最大堆,但它没有产生预期的结果 请检查代码并告诉我我哪里出错了,如果有人建议对 downadjust 函数进行哪些更改将帮助我制作最小堆(这是我必须编写的下一个问题),这将非常有帮助
#include <iostream>
using namespace std;
void downadjust(int heap[],int i){
// n is size
int n=heap[0];
int j,flag=1;
while(2*i<=n && flag==1){
j=2*i;
if(j+1<=n && heap[j+1]>heap[j]){
j=j+1;
}
if(heap[i]>heap[j]) flag=0;
else
{
swap(heap[i],heap[j]);
i=j;
}
}
}
void disp(int heap[],int n){
for(int i=1;i<n;i++){
cout<<heap[i]<<" ";
}
}
int main()
{
int n;
cout<<"no of stud";
cin>>n;
n++;
int heap[n];
heap[0]=n-1;
for(int i=1;i<n;i++){
cin>>heap[i];
}
for(int i=n/2;i>=1;i--){
downadjust(heap,i);
}
disp(heap,n);
cout<<endl;
cout<<"max is "<<heap[1];
return 0;
}
5 1 9 2 11 50 6 100 7
的结果是有效堆 100 11 50 7 5 9 6 2 1
。
也许您想要 50 11
序列和其他有序的子节点对,但堆构造不提供子节点的严格相互排序(如二叉搜索树那样)。
要做minheap,只需要改两个比较:
if (j + 1 <= n && heap[j + 1] < heap[j]) {
j = j + 1;
}
if (heap[i] < heap[j]) flag = 0;