我做了一个小程序,它使用合并排序算法合并两个数组,但令人惊讶的是它在执行时停止工作......它没有任何编译错误。
#include<iostream>
#include<array>
using namespace std;
int main()
{
// below are declarations of two single dimensional arrays and two variables
int n1,n2,t1,t2,t3;
int l1 [5] = {2,1,4,3,5};
int l2 [5] = {8,6,7,9,10};
int l3 [10];
n1 = l1[4] - l1[0] +1;
n2 = l2[4] - l2[0] +1;
//below are the declaration and initialization of two pointers
t1 = l1[0];
t2 = l2[0];
t3 = l3[0];
while((n1>0) && (n2>0) )
{
if (l1[t1] < l2[t2])
{
l3[t3] = l1[t1];
t1++;
t3++;
n1--;
cout<<l3[t3]<<endl;
}
else
l3[t3] = l2[t2];
t2++;
t3++;
n2--;
}
}
我仍然没有决定程序的输出
答案 0 :(得分:1)
你对指针非常困惑。这样:
n1 = l1[4] - l1[0] + 1;
获取l1[4]
的值,减去l1[0]
的值,然后添加1
。您似乎认为l1[4] - l1[0]
将为您提供数组中元素的数量,而不是1
。你真正想要的是:
n1 = sizeof l1 / sizeof l1[0];
同样,这:
t1 = l1[0];
没有制作&#34;指针&#34; - t1
只是一个int
,其中包含l1[0]
的值,而不是它的地址。正如评论中指出的那样,即使它是一个指针,你也无法将它用作索引。你真正想要的是:
t1 = 0;
最后,这个:
while( (n1 > 0) && (n2 > 0) )
只有你的一个数组才会停止。你想要的是:
while( (n1 > 0) || (n2 > 0) )
虽然如果l1
包含任何高于l2
的元素,这将会中断。
这是您的程序的修改版本,它实现了您的算法:
#include <iostream>
int main()
{
int l1[5] = {2, 1, 4, 3, 5};
int l2[5] = {8, 6, 7, 9, 10};
int l3[10] = {0};
int n1 = sizeof l1 / sizeof l1[0];
int n2 = sizeof l2 / sizeof l2[0];
int t1 = 0, t2 = 0, t3 = 0;
while ( (n1 > 0) || (n2 > 0) ) {
if ( l1[t1] < l2[t2] ) {
l3[t3++] = l1[t1++];
--n1;
}
else {
l3[t3++] = l2[t2++];
--n2;
}
}
for ( int i = 0; i < sizeof l3 / sizeof l3[0]; ++i ) {
std::cout << l3[i] << std::endl;
}
return 0;
}
带输出:
paul@horus:~/src/sandbox$ ./ms
2
1
4
3
5
8
6
7
9
10
paul@horus:~/src/sandbox$
显然,正如实现的那样,你的算法会合并两个列表,但是如果它们最初没有排序,那么你不会最终得到一个排序列表。如果您确实想要以排序列表结束,那么您还有更多工作要做。此外,如上所述,对于大多数阵列,您的算法通常无法正常工作。