【问题标题】:How to sort a 2d array from max to min如何将二维数组从最大值排序到最小值
【发布时间】:2019-04-05 17:00:30
【问题描述】:

我有一个 6 行 2 列的二维数组,需要根据第二列的值进行排序。

我知道冒泡排序算法适用于一维数组,但我很困惑如何专门比较第二行。

for (int i = 1; i < 7; i++) {
    for (int j = i + 1; i < 7; i++) {
       int temp = copy[i][j];
       copy[i][j] = copy[j][i];
       copy[j][i] = temp;
    }
}

我希望我的代码如下所示:

1.0 10.0
2.0 8.0
3.0 11.0 
4.0 12.0 
5.0 2.0
6.0 7.0 

对此:

4.0 12.0
1.0 10.0
3.0 11.0
2.0 8.0
6.0 7.0 
5.0 2.0 

当使用此代码对数组进行排序时,我只得到 1 个值。正如您在上面看到的,仅对第二列进行了排序。

【问题讨论】:

  • 很抱歉,如标题所述,这是针对 C 的。
  • 你的问题不清楚。您提到您想根据第二列的值进行排序,然后说 - 我希望我的代码看起来像这样:显示按第一列排序的数据乙>。还有你使用的是哪种语言。请具体。
  • 比较第二列中的值,第一列中的值只是坚持那个数字。

标签: c arrays algorithm sorting


【解决方案1】:

为什么要重新发明轮子?使用 C 标准库中的 qsort(),如下所示(任何 ROWSxCOLS 矩阵的通用示例):

#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort */
#define ROWS 6
#define COLS 2

int cmp(const void* p1, const void* p2)
{
  const float* arr1 = (const float*)p1;
  const float* arr2 = (const float*)p2;
  return (arr2[1] > arr1[1]) - (arr2[1] < arr1[1]);
}

int main(void)
{
  float array[ROWS][COLS] = {
    {1.0, 10.0},
    {2.0, 8.0},
    {3.0, 11.0},
    {4.0, 12.0},
    {5.0, 2.0},
    {6.0, 7.0}
  };

  qsort(array, ROWS, COLS * sizeof(float), cmp);

  for(int i = 0 ; i < ROWS; i++)
    printf("%f, %f\n", array[i][0], array[i][1]);

  return 0;
}

输出:

4.000000, 12.000000
3.000000, 11.000000
1.000000, 10.000000
2.000000, 8.000000
6.000000, 7.000000
5.000000, 2.000000

【讨论】:

  • return arr2[1] - arr1[1]; 不正确:减法以float 执行,转换为int 会截断值,可能使不同的数字看起来相等并导致意外行为。如果你想处理 NaN 值,你应该使用 return (arr2[1] &gt; arr1[1]) - (arr2[1] &lt; arr1[1]); 或编写更复杂的函数。
  • 我太马虎了@chqrlie,很好,谢谢,答案已更正!感谢您的反对,真的! :)
猜你喜欢
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 2012-04-16
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
相关资源
最近更新 更多