从您提供的代码片段中,我假设您正在尝试分别对矩阵的每一行进行排序。我注意到的第一件事是在矩阵的列(第二索引)的内存分配中存在拼写错误。一个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");
}
希望这有助于!如果你需要将整个矩阵作为一个整体进行排序......这是一个不同的野兽。
你的'comp'函数是错误的。如果'a'是最小可能的整数值而'b'是1呢?那么'a - b'将是整数运算中最大可能的整数值(在大多数系统中),即使'comp'的结果应该是负值,这也是正值。 – 2012-03-12 19:19:54
三个整数是单个大值吗? (即如果int是32位,它是一个96位数) – Skizz 2012-03-12 19:22:36
3最初表示第二维内的3个空格,就像第1行有3个值。 – 2012-03-12 19:26:49