我在机器上运行双音排序顺序代码。它对于最多 16 个元素的数组大小运行良好,但是一旦我将大小增加到 32,它在执行时会出现以下错误:
“警告:进程 654 终止:分段错误 (11)。”
有人可以帮我怎么回事吗?当大小增加到32时它会占用很多内存这是为什么会出现这个问题吗?
我想将其测试为并行版本。所以,我需要一些相当长的数组大小进行比较..
以下是我的代码:
void merge_up(int *arr, int n)
{
int step=n/2,i,j,k,temp;
while (step > 0)
{
for (i=0; i < n; i+=step*2)
{
for (j=i,k=0;k < step;j++,k++)
{
if (arr[j] > arr[j+step])
{ // swap
temp = arr[j];
arr[j]=arr[j+step];
arr[j+step]=temp;
}
}
}
step /= 2;
}
}
void merge_down(int *arr, int n)
{
int step=n/2,i,j,k,temp;
while (step > 0)
{
for (i=0; i < n; i+=step*2)
{
for (j=i,k=0;k < step;j++,k++)
{ if (arr[j] < arr[j+step])
{ // swap
temp = arr[j];
arr[j]=arr[j+step];
arr[j+step]=temp;
}
}
}
step /= 2;
}
}
int main(int argc, char **argv)
{
int n, i, s;
n = 32;
int arr[32] = {234, 233, 22, 1, 22, 8, 1, 89, 5, 34, 21, 9, 222, 2, 1, 999, 21, 12, 23, 32, 21, 111, 45, 23, 211, 21, 232, 45, 22, 11, 9876, 22, 2, 3, 555, 333};
printArray(arr,n);
// do merges
for (s=2; s <= n; s*=2)
{
for (i=0; i < n;)
{
merge_up((arr+i),s);
merge_down((arr+i+s),s);
i += s*2;
}
}
printArray(arr,n);
}// END
void printArray(int *arr, int n)
{
int i;
printf("[%d",arr[0]);
for (i=1; i < n;i++)
{
printf(",%d",arr[i]);
}
printf("]\n");
}