2014-08-29 87 views
0
#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函數假設,以確保每個父節點具有其相應的二進制tree.The誤差的最大值爲約矢量下標超出範圍,但我無法找出哪個向量索引超出範圍。請幫助並感謝大家的幫助。矢量下標超出範圍的錯誤在heapify功能

+1

哎呀,您必須先修復縮進。 – HuStmpHrrr 2014-08-29 17:01:45

+0

請勿縮進選項卡。特別是不要縮進與製表符和空格的混合物。 – 2014-08-29 17:25:20

回答

0

heapify()函數中的for循環的終止條件不正確。循環將通過對應於原始堆的葉節點的索引繼續進行,並嘗試將其兒童提取爲index[lchild]index[rchild]。或者實際上只是前者,因爲那是你的下標違規發生的地方。

此外,爲什麼你在世界上使用double s爲您的櫃檯和指數?你應該使用整數類型。 int將是默認選擇。結果會更清晰和更快,您可以完全避免floor()函數。