在 C 中调试排序算法(QuickSort 变体)

问题描述 投票:0回答:0

部分任务是根据元素之和对大小为 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 数组的那一行停止。

如果您能提供任何帮助或建议,我将不胜感激。作为编程的初学者,对我的工作的任何反馈或更正将不胜感激并且非常有帮助。

c sorting debugging memory-management dynamic-memory-allocation
© www.soinside.com 2019 - 2024. All rights reserved.