我正在实现合并排序代码。我写的代码是:
#include<iostream>
using namespace std;
void merge(int *A,int i,int k,int j)
{
int l1,l2,c,d;
int B[j - i + 1],ind = 0;
l1 = k - i + 1; c = i;
l2 = j - k; d = k + 1;
while(l1 > 0 && l2 > 0)
{
if(A[c] < A[d])
{
B[ind] = A[c];
c++; l1--;
}
else
{
B[ind] = A[d];
d++; l2--;
}
ind++;
}
while(l1 != 0)
{
B[ind] = A[c];
c++; l1--; ind++;
}
while(l2 != 0)
{
B[ind] = A[d];
d++; l2--; ind++;
}
for(int l = i;l < j - i + 1;l++)
{
A[l] = B[l];
}
}
int mergesort(int *A,int i,int j)
{
if(i == j)
return 0;
int k = (j - i)/2;
mergesort(A,i,k);
mergesort(A,k + 1,j);
merge(A,i,k,j);
return 0;
}
int main()
{
int A[] = {1,5,3,4,2,6};
mergesort(A,0,5);
for(int i = 0;i < 6;i++)
{
cout<<A[i]<<endl;
}
}
编译器给出以下错误:
Program received signal SIGSEGV, Segmentation fault.
0x0000000008000b34 in mergesort (A=<error reading variable: Cannot access memory at address
0x7fffff7eeff8>,
i=<error reading variable: Cannot access memory at address 0x7fffff7eeff4>,
j=<error reading variable: Cannot access memory at address 0x7fffff7eeff0>) at inv_count.cpp:42
42 {
如果只调用合并排序的第一个实例,则程序运行良好。但它为第二次调用提供了错误。 有人可以告诉我为什么会发生这种情况以及如何解决它吗?
你对中点 k 的计算是错误的,它应该是:
int k=(i+j)/2 ;
这解决了分段错误,但合并逻辑也不正确。