You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三维数组全局按列排序算法改写求助:效果不符排查

三维Select8排序算法错误排查求助

我将运行正常的一维排序算法Select8_1D改写为适用于三维数组的Select8_3D算法,期望实现对P个二维矩阵的全局按列排序(非单列独立排序),但实际运行效果与预期不符,恳请协助排查问题。

三维算法代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

clock_t Select8_3D(int*** A, int P, int M, int N) {
    int Li, Ri, Lj, Rj, imin, imax, jmin, jmax, temp;

    clock_t time_start, time_stop;
    time_start = clock();

    for (int k = 0; k < P; k++) {

        Lj = 0;
        Rj = N - 1;

        while (Lj < Rj) {

            jmin = Lj;
            jmax = Lj;

            Li = 0;
            Ri = M - 1;

            while (Li < M) {
                imin = Li;
                imax = Li;

                // search for minimum and maximum for the leftmost column 
                for (int i = Li + 1; i < M; i++) {
                    if (A[k][i][jmin] < A[k][imin][jmin]) {
                        imin = i;
                    }
                    else if (A[k][i][jmin] > A[k][imax][jmin]) {
                        imax = i;
                    }
                }

                // search for minimum and maximum for rectangular area
                for (int j = Lj + 1; j < Rj; j++) {
                    for (int i = 0; i < M; i++) {
                        if (A[k][i][j] < A[k][imin][jmin]) {
                            imin = i;
                            jmin = j;
                        }
                        else if (A[k][i][j] > A[k][imax][jmax]) {
                            imax = i;
                            jmax = j;
                        }
                    }
                }


                // search for minimum and maximum for the rightmost column 
                for (int i = 0; i <= Ri; i++) {
                    if (A[k][i][Rj] < A[k][imin][jmin]) {
                        imin = i;
                        jmin = Rj;
                    }
                    else if (A[k][i][Rj] > A[k][imax][jmax]) {
                        imax = i;
                        jmax = Rj;
                    }
                }

                // repositioning of elements
                if (imin != Li && jmin != Lj) {
                    temp = A[k][imin][jmin];
                    A[k][imin][jmin] = A[k][Li][Lj];
                    A[k][Li][Lj] = temp;
                }

                if (imax != Ri && jmax != Rj) {
                    if (imax == Li && jmax == Lj) {
                        temp = A[k][imin][jmin];
                        A[k][imin][jmin] = A[k][Ri][Rj];
                        A[k][Ri][Rj] = temp;
                    }
                    else {
                        temp = A[k][imax][jmax];
                        A[k][imax][jmax] = A[k][Ri][Rj];
                        A[k][Ri][Rj] = temp;
                    }
                }

                Li += 1;
                Ri -= 1;
            }
            Lj += 1;
            Rj -= 1;
        }

    }

    time_stop = clock();
    return (time_stop - time_start);
}


void printMatrix(int*** A, int P, int M, int N) {
    for (int k = 0; k < P; ++k) {
        printf("matrix %d:\n", k + 1);
        for (int i = 0; i < M; ++i) {
            for (int j = 0; j < N; ++j) {
                printf("%d ", A[k][i][j]);
            }
            printf("\n");
        }
        printf("\n");
    }
}

int main() {
    int P = 2; // number of “matrices”
    int M = 10; // number of lines
    int N = 10; // number of columns

    // Memory allocation and matrix initialization
    int*** A = (int***)malloc(P * sizeof(int**));
    for (int i = 0; i < P; ++i) {
        A[i] = (int**)malloc(M * sizeof(int*));
        for (int j = 0; j < M; ++j) {
            A[i][j] = (int*)malloc(N * sizeof(int));
            for (int k = 0; k < N; ++k) {
                A[i][j][k] = rand() % 100; // случайные значения
            }
        }
    }

    // Output of initial matrices
    printf("Matrix before sorting:\n");
    printMatrix(A, P, M, N);

    // Algorithm call
    clock_t execution_time = Select8_3D(A, P, M, N);


    // Output of sorted matrices
    printf("\nSorted matrix:\n");
    printMatrix(A, P, M, N);

    // Memory release
    for (int i = 0; i < P; ++i) {
        for (int j = 0; j < M; ++j) {
            free(A[i][j]);
        }
        free(A[i]);
    }
    free(A);

    return 0;
}

效果对比

  • 实际效果:实际效果
  • 期望效果:期望效果

一维算法代码(运行正常)

clock_t Select8_1D(int* A, int N, int P) {
    int L, R, imin, imax, tmp;

    clock_t time_start, time_stop;
    time_start = clock();

    L = 0; R = N - 1;

    while (L < R) {
        imin = L; imax = L;

        for (int i = L + 1; i < R + 1; i++) {
            if (A[i] < A[imin]) {
                imin = i;
            }
            else if (A[i] > A[imax]) {
                imax = i;
            }
        }

        if (imin != L) {
            tmp = A[imin];
            A[imin] = A[L];
            A[L] = tmp;
        }

        if (imax != R) {
            if (imax == L) {
                tmp = A[imin];
                A[imin] = A[R];
                A[R] = tmp;
            }
            else {
                tmp = A[imax];
                A[imax] = A[R];
                A[R] = tmp;
            }
        }

        L = L + 1;
        R = R - 1;
    }
    time_stop = clock();
    return (time_stop - time_start) * P;
}

一维算法运行效果

一维效果

我已尝试排查但毫无头绪,恳请协助找出三维算法中的错误。


内容的提问来源于stack exchange,提问作者apromise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:27:01