在C中对2D数组进行排序

时间:2014-11-27 09:08:01

标签: c arrays sorting

我有这个数组:

[105][2500]
[110][1800]
[105][800]
[105][1300]
[110][1200]
...

我需要这个:

[105][800]
[105][1300]
[105][2500]
[110][1200]
[110][1800]
...

新编辑:现在我的代码是: row是行的nuber,数组是2D int数组[row] [2]

 ...
 for (i = 0; i < row; i++)
    printf("(%d, %d)\n", array[i][0], array[i][1]);

 qsort(array, row, 2*sizeof(int), compare);

 printf("\n sorted: \n");
 for (i = 0; i < row; i++)
    printf("(%d, %d)\n", array[i][0], array[i][1]);
 ...

比较功能:

int compare(void const *p_lhs, void const *p_rhs) {
  int const *lhs = (int const *) p_lhs;
  int const *rhs = (int const *) p_rhs;

//  printf("%d %d  - %d %d", lhs[0], rhs[0], lhs[1], rhs[1]);
  if(lhs[0] < rhs[0]) return -1;
  if(lhs[0] > rhs[0]) return  1;
  if(lhs[1] < rhs[1]) return -1;
  if(lhs[1] > rhs[1]) return  1;

  return 0;
}

在比较函数中使用pritf输出:http://i.imgur.com/QPUXEPF.png 输出为:http://i.imgur.com/pzk8KAU.png

1 个答案:

答案 0 :(得分:3)

令人高兴的是,标准库中有qsort。实际上,您所要做的就是为外部数组的元素提供比较函数。例如:

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

// lexicographical comparison.
// Returns -1 for lhs < rhs, 1 for lhs > rhs, 0 for lhs == rhs.
int compare_line(void const *p_lhs, void const *p_rhs) {
  // These point to the elements of the outer arrays (that is,
  // they point to the inner arrays)
  double const *lhs = (double const *) p_lhs;
  double const *rhs = (double const *) p_rhs;

  if(lhs[0] < rhs[0]) return -1;
  if(lhs[0] > rhs[0]) return  1;
  if(lhs[1] < rhs[1]) return -1;
  if(lhs[1] > rhs[1]) return  1;

  return 0;
}

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof*(arr))

int main(void) {
  double data[][2] = {
    { 105,  800 },
    { 105, 1300 },
    { 105, 2500 },
    { 110, 1200 },
    { 110, 1800 }
  };

  // Sorting here.
  qsort(data, ARRAY_SIZE(data), sizeof(data[0]), compare_line);

  for(size_t i = 0; i < ARRAY_SIZE(data); ++i) {
    printf("%lf %lf\n", data[i][0], data[i][1]);
  }
}