QuickSort,崩溃了一些数组

时间:2017-12-24 12:46:55

标签: c arrays sorting quicksort

今天我对一个简单的快速排序算法和一个使用Hoare方法的分区感到疯狂。

代码是:

static void swap(float **A, int i, int j){
    float *tmp = A[i];
    A[i] = A[j];
    A[j] = tmp;
}

static int partition(float **A, int l, int r){
    int i, j, k;

    i = l - 1;
    j = k = r;

    while(1){
        while ((int)A[++i][0] < (int)A[k][0]);
        while ((int)A[--j][0] > (int)A[k][0]);

        if (j == l || j <= i)
            break;

        swap(A, i, j);
    }

    swap(A, i, k);
    return i;
}

static void quicksortR(float **A, int l, int r){
    int q, i;

    if (r <= l)
        return;

    q = partition(A, l, r);
    quicksortR(A, l, q - 1);
    quicksortR(A, q + 1, r);
}

void sort(float **A, int l, int r){
    quicksortR(A, l, r);
}

有一个转换为int,因为A是一个浮点指针数组(或动态分配的矩阵,顺便说一句),其中第一列(index = 0)包含一个int。

使用(rand()%60)返回的值生成此列,并在每次代码运行时初始化新种子,以便每次都不生成相同的数字。

矩阵分配有此函数

float **floatMatAlloc(int nr, int nc){
    int i;
    float **mat;

    mat = malloc(nr * sizeof(float *));
    for (i = 0; i < nr; i++)
        mat[i] = calloc(nc, sizeof(float));

    return mat;
}

并使用参数sort(mat,0,9)调用函数sort(),使用mat = floatMatAlloc(10,4)调用floatMatAlloc。

使用gdb我看到有一些矩阵,j索引通常变为-1,显然它会崩溃,事实上如果我把它放在partition()

while (--j >= 0 && (int)A[j][0] > (int)A[k][0]);

它有效!并且我不知道为什么使用某些矩阵,我实现的算法和其他矩阵不起作用!

我尝试使用经典的int数组(而不是使用伪矩阵)并使用经典的同时,这与我在其他代码中找到的相同

0 个答案:

没有答案