Qsorting 2d指针数组

时间:2012-03-12 19:17:50

标签: c qsort

我正在尝试使用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指针。

1 个答案:

答案 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");
}

希望这有帮助!如果你需要将整个矩阵整体排序......那就是一个不同的野兽。