我刚写了一段代码来合并2个排序的数组。合并工作正常。但是当我尝试打印排序的数组时。我得到了一堆1的重复
我的代码:
#include <iostream>
using namespace std;
#define G_N_ELEMENTS(arr) ((sizeof(arr))/(sizeof(arr[0])))
class mergeArray{
public:
int *A,*B,*C;
mergeArray(int *A,int *B)
{
this->A = A;
this->B = B;
}
void mergeArrays(int sizeA,int sizeB)
{
int newSize = sizeA+sizeB;
C = new int[newSize+1];
int i=0,j=0,k=0;
while(k<newSize)
{
if(*(A+i)<*(B+j))
{
*(C+k)=*(A+i);
if(i<sizeA)i++;
}
else
{
*(C+k)=*(B+j);
if(j<sizeB)j++;
}
k++;
}
*(C+newSize) = -1;
}
void printMergeArray()
{
int i=0;
while(*(C+i)!=-1)
{
cout<< *(C+i)<<endl;
}
}
};
int main(int argc, char **argv)
{
int A[5]={1,3,5,7,9};
int B[5]={2,4,6,8,10};
mergeArray mm(A,B);
int sizeA = G_N_ELEMENTS(A);
int sizeB = G_N_ELEMENTS(B);
mm.mergeArrays(sizeA,sizeB);
mm.printMergeArray();
return 0;
}
我做错了什么?我使用gdb调试了代码。合并工作正常,当我使用GDB打印命令打印时,合并的数组具有正确的值。
答案 0 :(得分:1)
我意识到您已经从其中一条评论中得到了答案 - 您没有在printMergeArray
中增加索引。
我对这个答案的动机是建议一些风格上的变化:
我认为while
形式的循环
while(k<newSize)
{
k++;
}
不如形式:
for( k = 0; k < newSize; ++k)
{
}
此外,
*(C+k)=*(A+i);
if(i<sizeA)i++;
可以被强有力的断言取代。
assert(i < sizeA);
*(C+k)=*(A+i);
i++;
类似地,
*(C+k)=*(B+j);
if(j<sizeB)j++;
可以替换为:
assert(j < sizeB);
*(C+k)=*(B+j);
j++;