2017-06-23 6 views
1

私は並べ替えられた順序で行と列の並べ替えられた行列要素を印刷しようとしています。 MATRIXの行数と同じサイズのMIN-HEAPを使用しています。私はすべての私の場合に望ましい出力を得ています。 一部のゼロがであることを除いて、望ましい出力の間に発生します。これらのゼロが実際にヒープに挿入されている場所を見つけていないようです。ここでこのプログラムからは、行と列のソートされた行を昇順に出力するゼロはどこにありますか?

は試運転の例である:http://ideone.com/Ctmo91

#include<iostream> 
#include<limits.h> 
using namespace std; 

struct heapnode 
{ 
    int element; 
    int r; 
    int c; 
}; 
class heap 
{ 
public: 
    struct heapnode *harr; 
    int heapsize; 
    int capacity; 

    heap(int n) 
    { 
     harr = new heapnode[n]; 
     heapsize = 0; 
     capacity = n; 
    } 
    void minheapify(int i) 
    { 
     int smallest=i,lchild,rchild; 
     while(1) 
     { 
      lchild = 2*i + 1; 
      rchild = 2*i + 2; 
      if(lchild<heapsize && harr[smallest].element > harr[lchild].element) 
       smallest = lchild; 
      if(rchild<heapsize && harr[smallest].element > harr[rchild].element) 
       smallest = rchild; 
      if(smallest!=i) 
      { 
       swap(harr[i],harr[smallest]); 
       i = smallest; 
      } 
      else 
       break; 
     } 
    } 
    void buildheap(int n) 
    { 
     heapsize = n; 
     for(int i=heapsize/2 -1;i>=0;i--) 
      minheapify(i); 
    } 
}; 
void printSortedMatrix(int **arr,int m,int n) 
{ 
    int k=m; 
    int i,j; 
    heap H(m); 
    struct heapnode hr; 
    int count =0; 
    while(1) 
    { 
     //cout<<count<<endl; 
     if(count < k-1) 
     { 
      //cout<<count<<" "<<k<<endl; 
      H.harr[count] = {arr[count][0],count,0}; 
     } 
     else 
     { 
      if(count==k-1) 
      { 
       H.harr[count] = {arr[count][0],count,0}; 
       H.buildheap(k); 
      } 
      if(H.harr[0].element==999) 
       break; 

      cout<<H.harr[0].element<<" "; 

      hr = H.harr[0]; 
      if(hr.c==n) 
       H.harr[0] = {999,0,0}; 
      else 
       H.harr[0] = {arr[hr.r][hr.c+1],hr.r,hr.c+1}; 
      H.minheapify(0); 
     } 
     count++; 
    } 
    cout<<endl; 
} 

int main() 
{ 
    //code 
    int t,N,**arr,i,j,M; 
    cin>>t; 
    while(t--) 
    { 
     cin>>M; 
     N = M; 
     arr = new int*[M]; 
     for(i=0;i<M;i++) 
      arr[i] = new int[N]; 
     for(i=0;i<M;i++) 
      for(j=0;j<N;j++) 
       cin>>arr[i][j]; 
     printSortedMatrix(arr,M,N); 
    } 
    return 0; 
} 
+3

これをvalgrindで実行します。私はあなたがあなたの割り当て境界外にアクセスし、未定義の動作を呼び出す可能性が高いと言いたいと思います。私はまた、あなたが最初のテストを排除し、これを評価する際に2番目のテストを使用することをお勧めします。十分なはずです。 – WhozCraig

+0

@WhozCraig私はCODEBLOCKS IDEデバッガを使って範囲外のアクセスをチェックしようとしました。私は間違ったことは見つけられなかった。このためにvalgrindを再び使用するように私に提案してください。私は窓にいます:( –

+0

ヒント: 'rheild'が' minheapify'で持つ値の範囲は何ですか? – 1201ProgramAlarm

答えて

1

は最後にバグを発見しました。私は実際に各行に要素を追加していました。

if(hr.c==n) 
    H.harr[0] = {999,0,0}; 
else 
    H.harr[0] = {arr[hr.r][hr.c+1],hr.r,hr.c+1}; 

一方が気づく可能性として、それは実際からN-1の範囲ながら、プログラムは、Nする列番号をチェックされます。

if(hr.c==n-1)    //The change 
    H.harr[0] = {999,0,0}; 
else 
    H.harr[0] = {arr[hr.r][hr.c+1],hr.r,hr.c+1}; 
関連する問題