部分任务是根据元素之和对大小为 P、M、N 的三维数组的每个部分的列进行排序。为此,我需要修改给定的算法,它是 C 上 QuickSort 的变体。
void QuickSort(int L, int R)
{
int B, tmp, i, j;
B = VectA[(L + R) / 2];
i = L;
j = R;
while (i <= j)
{
while (VectA[i] < B)
i = i + 1;
while (VectA[j] > B)
j = j - 1;
if (i <= j)
{
tmp = VectA[i];
VectA[i] = VectA[j];
VectA[j] = tmp;
i = i + 1;
j = j - 1;
}
}
if (L < j)
QuickSort(L, j);
if (i < R)
QuickSort(i, R);
}
我试过这样解决:
void QuickSort_3D(int L, int R, int currP)
{
printf("%d %d %d\n", L, R, currP);
int B, tmp, i, j;
int *Sum = (int *)malloc((R - L) * sizeof(int));
for (int i = 0; i < R; i++)
{
Sum[i - L] = 0;
for (int j = 0; j < M; j++)
{
Sum[i] += Arr3D[currP][j][i];
}
}
B = Sum[(R - (R-L)/2) - L];
printf("B = %d %d\n", B,(R - (R-L)/2) - L);
i = L;
j = R;
while (i <= j)
{
while (Sum[i - L] < B)
i = i + 1;
while (Sum[j - L] > B)
j = j - 1;
if (i <= j)
{
for (int k = 0; k < M; k++)
{
tmp = Arr3D[currP][k][i];
Arr3D[currP][k][i] = Arr3D[currP][k][j];
Arr3D[currP][k][j] = tmp;
}
tmp = Sum[i - L];
Sum[i - L] = Sum[j - L];
Sum[j - L] = tmp;
i = i + 1;
j = j - 1;
}
}
printf("FREE\n");
free(Sum);
printf("%d %d\n", i, j);
if (L < j)
{
QuickSort_3D(L, j, currP);
}
if (i < R)
{
QuickSort_3D(i, R, currP);
}
printf("back\n");
}
这个函数的调用:
for (int p = 0; p < P; p++)
{
Sort(0, N, p);
}
但是当它在几次调用后尝试使用
Process returned -1073740940 (0xC0000374)
释放 Sum 数组的内存时,它总是出现 free(Sum);
错误,并且最后出现在控制台中的是消息 FREE
。此外,如果我使用调试模式,它会恰好在尝试释放 Sum 数组的那一行停止。
如果您能提供任何帮助或建议,我将不胜感激。作为编程的初学者,对我的工作的任何反馈或更正将不胜感激并且非常有帮助。