今天我对一个简单的快速排序算法和一个使用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数组(而不是使用伪矩阵)并使用经典的同时,这与我在其他代码中找到的相同