2017-06-23 39 views
1

我想按排序的順序打印rowwise和按列排序的矩陣元素。我使用的MIN-HEAP的大小與給定MATRIX的行數相同。我得到了我所有案例的理想輸出。 除了一些零點,發生在期望的輸出之間。我似乎沒有找到這些零實際插入到堆中的位置。來自此程序的零值在哪裏按升序顯示按行和按列排序的矩陣?

這裏是試運行的例子: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運行。我想說,你很可能訪問了你的分配邊界之外,並調用未定義的行爲。我還建議你消除第一次測試,並在第二次測試時使用第二次測試。它應該是足夠的。 – WhozCraig

+0

@WhozCraig我試過使用CODEBLOCKS IDE調試器檢查出界限訪問。我沒有發現任何錯誤。你會重新建議我再次使用valgrind嗎?我在窗口:( –

+0

提示:什麼是'minchopify'中'rchild'會有什麼值? – 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個

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};