我正在尝试使用qsort对2d指针数组进行排序。我现在唯一的问题是最初我使用静态声明的数组现在切换到指针。我几乎想要改用结构但是顽固不能让我无法工作。
到目前为止,我在malloc中使用了2d指针数组[array2d [m] [3]是预期的大小]:
int **array2d;
array2d = (int**)malloc((m)*sizeof(int*));
for(i=0; i<=m; i++)
array2d = [i]=(int*)malloc(3*sizeof(int));
qsort(array2d, m, 3*sizeof(int**),comp);
我的比较是:
int comp(const void* left, const void*right)
{
const int *a = *(const int**)left;
const int *b = *(const int**)right;
return a-b;
}
虽然我不确定如何构建比较以使用2d指针。
答案 0 :(得分:1)
从您提供的代码段我假设您正在尝试分别对矩阵的每一行进行排序。我注意到的第一件事是矩阵的列(第二个索引)的内存分配中存在拼写错误。
numRow x numColumns 矩阵的内存分配如下:
/* loop counter */
int i;
/* dynamic array sizes */
const int numRow = 5;
const int numColumns = 25;
/* allocate the row pointers */
int **dynamic2d = (int **)malloc(numRow * sizeof(int *));
/* for each row pointer */
for(i = 0; i < numRow; i++)
{
/* allocate columns */
dynamic2d[i] = (int *)malloc(numColumns * sizeof(int));
}
接下来,您将无法仅调用qsort(..)方法一次。该方法需要“平坦”或一维数组。您需要为矩阵的每一行分别调用qsort(...)方法。这在下面说明:
/* sort array */
for(i = 0; i < numRow; i++)
qsort(dynamic2d[i], numElements, sizeof(int *), comp);
最后,您的比较器方法出错了。此方法具有严格的规则,需要遵循才能正常工作。当前specifications说,“应用程序应确保函数返回小于,等于或大于0的整数,如果第一个参数被认为分别小于,等于或大于第二。如果两个成员比较相等,则排序数组中的顺序未指定。“
这是一个简单的解决方法。只需编写逻辑来生成这些结果,如下所示:
int comp(const void* firstArg, const void* secondArg)
{
/* get the values of the arguments */
int first = *(int *)firstArg;
int second = *(int *)secondArg;
/* return the value as expected by the qsort() method */
if(first < second)
{
return 1;
}
else if(second < first)
{
return -1;
}
return 0;
}
最后要注意的是,这将是最重要的。 如果你想要最小的话,不要在比较器中切换逻辑。排序不会返回准确的结果。正确的方法是从后向前读取数组,如下所示:您可以交换比较器中的参数来更改排序顺序或从后到前读取结果。
int comp(const void* firstArg, const void* secondArg)
{
/* get the values of the arguments */
int first = *(int *)secondArg;
int second = *(int *)firstArg;
...
}
或
/* print greatest to smallest */
for(i = 0; i < numRow; i++)
{
/* start at front and work to back */
for(j = 0; j < numColumns; j++)
printf("%d ", dynamic2d[i][j]);
printf("\n");
}
/* print smallest to greatest */
for(i = 0; i < numRow; i++)
{
/* start at back and work to front */
for(j = numColumns- 1; j >= 0; j--)
printf("%d ", dynamic2d[i][j]);
printf("\n");
}
希望这有帮助!如果你需要将整个矩阵整体排序......那就是一个不同的野兽。