我几年没有做任何编程课程,所以请原谅任何初学者错误/做某事的方法。我喜欢对未来的建议。使用下面的代码,我试图检查两个数组的值(已经排序)并将它们放入组合数组中。我的解决方案,无论多么低效/草率,都是使用for循环来比较j处每个数组索引的内容,然后将较低的值分配给combinedArray的索引i,将较高的值分配给索引i + 1。我将i递增2以避免覆盖前一个循环的索引。
int sortedArray1 [5] = {11, 33, 55, 77, 99};
int sortedArray2 [5] = {22, 44, 66, 88, 00};
combinedSize = 10;
int *combinedArray;
combinedArray = new int[combinedSize];
for(int i = 0; i <= combinedSize; i+=2)
{
for(int j = 0; j <= 5; j++)
{
if(sortedArray1[j] < sortedArray2[j])
{
combinedArray[i] = sortedArray1[j];
combinedArray[i+1] = sortedArray2[j];
}
else if(sortedArray1[j] > sortedArray2[j])
{
combinedArray[i] = sortedArray2[j];
combinedArray[i+1] = sortedArray1[j];
}
else if(sortedArray1[j] = sortedArray2[j])
{
combinedArray[i] = sortedArray1[j];
combinedArray[i+1] = sortedArray2[j];
}
}
}
for(int i = 0; i < combinedSize; i++)
{
cout << combinedArray[i];
cout << " ";
}
我的结果就是这个
Sorted Array 1 contents: 11 33 55 77 99
Sorted Array 2 contents: 0 22 44 66 88
5 77 5 77 5 77 5 77 5 77 Press any key to continue . . .
在我缺乏经验的头脑中,排序的实现看起来很好,所以我不确定为什么我会得到这个糟糕的输出。建议太棒了。
答案 0 :(得分:3)
怎么样:
int i=0,j=0,k=0;
while(i<5 && j<5)
{
if(sortedArray1[i] < sortedArray2[j])
{
combinedArray[k]=sortedArray1[i];
i++;
}
else
{
combinedArray[k]=sortedArray2[j];
j++;
}
k++;
}
while(i<5)
{
combinedArray[k]=sortedArray1[i];
i++;k++;
}
while(j<5)
{
combinedArray[k]=sortedArray2[j];
j++; k++;
}
答案 1 :(得分:1)
在查看实施之前,请检查算法并用笔和纸将其写下来。弹出的第一件事是你假设结果中的前两个元素将来自每个源数组。不一定是这种情况,考虑两个数组,其中一个中的所有元素都小于另一个中的所有元素和预期结果:
int a[] = { 1, 2, 3 };
int b[] = { 4, 5, 6 };
如果您希望对结果进行排序,那么前三个元素将来自第一个数组。考虑到这一点,请考虑您对数据的真正了解。特别是,两个数组都被排序,这意味着第一个元素将小于相应数组中其余元素。这意味着较小的元件是较小的元件。通过将该元素放入结果中,您可以将问题减少到较小的集合。您有a' = { 2, 3 }
,b = { 4, 5, 6 }
和res = { 1 }
以及res
知道a'
和b
已排序的{{1}}的第二个元素的新问题
在纸上弄清楚你需要做什么,然后应该直接将其映射到代码。
答案 2 :(得分:1)
因此,我修改了您的代码以使其正常工作。实际上,为两个排序的数组提供两个指针/索引是个好主意。这样您就可以在将其添加到combinedArray后更新相应的指针。如果您不理解此代码的任何部分,请告诉我。感谢。
int sortedArray1 [5] = {11, 33, 55, 77, 99};
int sortedArray2 [5] = {0, 22, 44, 66, 88};
int combinedSize = 10;
int *combinedArray;
combinedArray = new int[combinedSize];
int j = 0;
int k = 0;
for(int i = 0; i < combinedSize; i++)
{
if (j < 5 && k < 5) {
if (sortedArray1[j] < sortedArray2[k]) {
combinedArray[i] = sortedArray1[j];
j++;
} else {
combinedArray[i] = sortedArray2[k];
k++;
}
}
else if (j < 5) {
combinedArray[i] = sortedArray1[j];
j++;
}
else {
combinedArray[i] = sortedArray2[k];
k++;
}
}
for(int i = 0; i < combinedSize; i++)
{
cout << combinedArray[i];
cout << " ";
}
cout<<endl;
答案 3 :(得分:0)
else if(sortedArray1[j] = sortedArray2[j])
,您的意思是else if(sortedArray1[j] == sortedArray2[j])
吗?
前一个会将sortedArray2 [j]的值赋给sortedArray1 [j] - 这就是为什么你得到5 77 5 77...
但是5
来自哪里? sortedArray
中没有5,但我发现for(int j = 0; j <= 5; j++)
一定是错误的。大小N
数组的最高索引是N-1
,而不是C / C ++中的N
(但不是基本的)..所以使用j<5
作为条件,或者你可能会陷入一些难以解释或预测的情况。
毕竟,算法本身存在问题,每次外循环循环时,它最终将比较两个数组中的最后一个元素,这使得输出重复两个数字。
因此您还需要更正算法,请参阅Merge Sort。
答案 4 :(得分:0)
略有不同的方法,这是恕我直言的更清洁:
//A is the first array, m its length
//B is the second array, n its length
printSortedAndMerged(int A[], int m, int B[], int n){
int c[n+m];
int i=0, j=0;
for(int k=0; k < n+m; k++){
if(i < m && j < n){
if(A[i] < B[j]){
c[k] = A[i];
i++;
}
else{
c[k] = B[j];
j++;
}
continue; //jump to next iteration
}
if(i < m){ // && ~(j < n)
//we already completely traversed B[]
c[k] = A[i];
i++;
continue;
}
if(j < n){ // %% ~(i < m)
//we already completely traversed A[]
c[k] = B[j];
j++;
continue;
}
//we should never reach this
cout << "Wow, something wrong happened!" << endl;
}//for
for(int i=0; i<n+m; i++){
cout << c[i] << endl;
}
}
希望它有所帮助。