#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
using namespace std;
void heapsort(vector<int> &input,int count){
}
int max_v(int tree[]){
int result;
result=tree[0];
for(int i=0;i<3;i++){
if(tree[i]>result){
result=tree[i];
}
}
return result;
}
bool judge(vector<int> &input,int count){
int j=0;
int start;
double parent=0;
double lchild;
double rchild;
int tree[3];
int max;
double i;
for(i=0;i<count;i++){
parent=floor((i-1)/2);
lchild=2*i+1;
rchild=2*i+2;
if(lchild>count-1){i++;}
if(rchild>count-1){i++;}
tree[0]=input[parent];
tree[1]=input[lchild];
tree[2]=input[rchild];
max=max_v(tree);
if(input[parent]!=max){j++;}
}
if(j==0){return true;}
return false;
}
void heapify(vector<int> &input,int count){
double parent=0;
double lchild;
double rchild;
int tree[3];
int max;
double i=0;
while(judge(input,count)==false){
for(i=0;i<count;i++){
parent=floor((i-1)/2);
lchild=2*i+1;
rchild=2*i+2;
if(lchild>count-1){i++;}
if(rchild>count-1){i++;}
tree[0]=input[parent];
tree[1]=input[lchild];
tree[2]=input[rchild];
max=max_v(tree);
if(input[lchild]==max){swap(input[parent],input[lchild]);}
if(input[rchild]==max){swap(input[parent],input[rchild]);}
}
}
}
int main(){
int count;
int tmp;
cin>>count;
vector<int> input;
for(int i=0;i<count;i++){
cin>>tmp;
input.push_back(tmp);
}
cout<<endl;
heapify(input,count);
for(int i=0;i<count;i++){
cout<<input[i]<<" ";
}
getchar();
getchar();
}
嗨,正如主题所述,我在我的heapify函数中发现错误,它假设确保每个父节点在其对应的二叉树中具有最大值。错误是关于向量下标超出范围但我无法找出哪个向量索引超出范围。请帮助并感谢大家的帮助。
答案 0 :(得分:0)
for
函数中heapify()
循环的终止条件不正确。循环将继续通过与原始堆的叶节点对应的索引,并尝试将他们的子项提取为index[lchild]
和index[rchild]
。或者实际上只是前者,因为那是你的下标违规发生的地方。
另外,为什么世界上你使用double
s作为你的指针和指数?你应该使用整数类型。 int
将是默认选择。结果会更清晰,速度更快,您可以完全避免使用floor()
功能。