heapify函数中的向量下标超出范围错误

时间:2014-08-29 17:00:51

标签: vector heapsort

#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函数中发现错误,它假设确保每个父节点在其对应的二叉树中具有最大值。错误是关于向量下标超出范围但我无法找出哪个向量索引超出范围。请帮助并感谢大家的帮助。

1 个答案:

答案 0 :(得分:0)

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

另外,为什么世界上你使用double s作为你的指针和指数?你应该使用整数类型。 int将是默认选择。结果会更清晰,速度更快,您可以完全避免使用floor()功能。