如何从最大到最小对二维数组排序

时间:2019-04-05 17:00:30

标签: c arrays algorithm sorting

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

我知道冒泡排序算法可以与一维数组配合使用,但是我对如何具体比较第二行感到困惑。

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个值。如您在上面看到的,仅第二列被排序。

1 个答案:

答案 0 :(得分:1)

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

#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