Vector heapify函数中的向量下标超出范围错误 #包括 #包括 #包括 #包括 使用名称空间std; void heapsort(向量和输入,整数计数){ } int max_v(int树[]){ int结果; 结果=树[0]; for(int i=0;iresult){ 结果=树[i]; } } 返回结果; } 布尔判断(向量和输入,整数计数){ int j=0; int启动; 双亲=0; 双lchild; 双拱门; int树[3]; int max; 双i; 对于(i=0;icount-1){i++;} 如果(rchild>count-1){i++;} 树[0]=输入[parent]; 树[1]=输入[lchild]; 树[2]=输入[rchild]; max=max_v(树); 如果(输入[parent]!=max){j++;} } 如果(j==0){返回true;} 返回false; } void heapify(向量和输入,整数计数){ 双亲=0; 双lchild; 双拱门; int树[3]; int max; 双i=0; while(判断(输入,计数)=false){ 对于(i=0;icount-1){i++;} 如果(rchild>count-1){i++;} 树[0]=输入[parent]; 树[1]=输入[lchild]; 树[2]=输入[rchild]; max=max_v(树); if(input[lchild]==max){swap(input[parent],input[lchild]);} if(input[rchild]==max){swap(input[parent],input[rchild]);} } } } int main(){ 整数计数; int tmp; cin>>计数; 矢量输入; 对于(inti=0;i>tmp; 输入。推回(tmp); } cout

Vector heapify函数中的向量下标超出范围错误 #包括 #包括 #包括 #包括 使用名称空间std; void heapsort(向量和输入,整数计数){ } int max_v(int树[]){ int结果; 结果=树[0]; for(int i=0;iresult){ 结果=树[i]; } } 返回结果; } 布尔判断(向量和输入,整数计数){ int j=0; int启动; 双亲=0; 双lchild; 双拱门; int树[3]; int max; 双i; 对于(i=0;icount-1){i++;} 如果(rchild>count-1){i++;} 树[0]=输入[parent]; 树[1]=输入[lchild]; 树[2]=输入[rchild]; max=max_v(树); 如果(输入[parent]!=max){j++;} } 如果(j==0){返回true;} 返回false; } void heapify(向量和输入,整数计数){ 双亲=0; 双lchild; 双拱门; int树[3]; int max; 双i=0; while(判断(输入,计数)=false){ 对于(i=0;icount-1){i++;} 如果(rchild>count-1){i++;} 树[0]=输入[parent]; 树[1]=输入[lchild]; 树[2]=输入[rchild]; max=max_v(树); if(input[lchild]==max){swap(input[parent],input[lchild]);} if(input[rchild]==max){swap(input[parent],input[rchild]);} } } } int main(){ 整数计数; int tmp; cin>>计数; 矢量输入; 对于(inti=0;i>tmp; 输入。推回(tmp); } cout,vector,heapsort,Vector,Heapsort,您的heapify()函数中的for循环的终止条件不正确。循环将继续通过与您的原型堆的叶节点对应的索引,并尝试将其子项提取为index[lchild]和index[rchild]。或者实际上只是前者,因为这就是发生下标冲突的地方 还有,你到底为什么要使用doubles作为计数器和索引?你应该使用整数类型。int将是默认选择。结果将更清晰,速度略快,你将能够避免floor()全部功能。哦,天哪,你必须先修正缩进。不要用制表符缩进。尤其不要用制表符和空格混合缩进。 #include<iostr

您的
heapify()
函数中的
for
循环的终止条件不正确。循环将继续通过与您的原型堆的叶节点对应的索引,并尝试将其子项提取为
index[lchild]
index[rchild]
。或者实际上只是前者,因为这就是发生下标冲突的地方


还有,你到底为什么要使用
double
s作为计数器和索引?你应该使用整数类型。
int
将是默认选择。结果将更清晰,速度略快,你将能够避免
floor()
全部功能。

哦,天哪,你必须先修正缩进。不要用制表符缩进。尤其不要用制表符和空格混合缩进。
#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();
}