【问题标题】:Qsorting 2d pointer arraysQsorting 2d 指针数组
【发布时间】:2012-03-12 19:17:50
【问题描述】:

我正在尝试使用 qsort 对二维指针数组进行排序。我现在唯一的问题是最初我使用的是静态声明的数组,现在切换到指针。我几乎很想切换到结构,但我固执地认为我无法让它工作。

到目前为止,我 malloc 指针的二维数组[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 指针。

【问题讨论】:

  • 您的comp 函数错误。如果a 是可能的最小整数值并且b 是1 怎么办?那么a - b 将是最大可能的整数值(在大多数系统上),因为整数运算中有回绕,即使comp 的结果应该是负数,它也是正数。
  • 这三个整数是一个大值吗? (即如果 int 是 32 位,它是 96 位数字)
  • 3 最初表示第二维内的 3 个空格,如第 1 行有 3 个值。
  • @AdamMihalcin 是的,现在我看看它我应该放 2 个案例来捕捉它,它最初适用于我拥有的其他程序,所以我没有篡改它。

标签: c qsort


【解决方案1】:

根据您提供的代码 sn-p,我假设您尝试分别对矩阵的每一行进行排序。我注意到的第一件事是矩阵的列(第二个索引)的内存分配有一个错字。

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

希望这会有所帮助!如果您需要将整个矩阵作为一个整体进行排序……那是完全不同的野兽。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多