对二维数组进行排序,就像C中的一维数组一样



我想对二维数组进行排序,如下所示:

4 2 5
1 3 7
6 9 8

获得这样的:

1 2 3
4 5 6
7 8 9

使用C.语言

解决这个问题的几个选项可能包括:

  1. 将输入的二维数组转换为一维数组,并使用标准库函数(如排序)
  2. 正如这里有人建议的那样,我可以有一个define或函数来使用1-D索引访问每个值,并使用插入排序或冒泡排序。

    ARRAY(索引)数组[(索引)/3][(索引)%3]

我不喜欢这两种选择,因为第一种需要临时空间,第二种可能会很慢。我的二维数组在行和列中都很大。我也很懒,不知道是否可以使用qsort的标准C库函数。我似乎无法将qsort与2-D数组一起使用,以获得所有元素的排序结果,就像1-D数组一样。

我得到了一个二维阵列,所以把它转换成一维阵列对我来说不是一个选择

谢谢你的建议。

正如龚志陶在评论中提到的,如果数组被定义为int `a[n][m]`,那么它被定义为内存中的一个连续块,或者通过提供指向第一个元素的指针并提供n*m作为数组长度,就可以像访问一维数组一样访问它。您可以在以下问题中找到关于数组如何在c中工作的更详细的解释http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c/4810668和http://stackoverflow.com/questions/7949589/2d-array-vs-array-of-arrays.

然而,如果不是这样的话,使用访问功能是最好的选择,原因有两个:
1.这是最直观的方法。如果将数组定义为int* a[n],则可能有n个指向m个非连续数组的指针。这意味着,就算法而言,除非你为它定义了一个函数,否则你必须判断下一个元素是什么(用于排序)。
2.一点也不慢。无论您选择什么排序算法,唯一的变化就是用新的访问函数(getArrayElement(a,i,j))替换每个一维数组访问(a[i])。函数本身非常小,甚至可能在编译过程中被内联,因此唯一的开销是计算,即每次访问两个额外的算术函数。由于不会改变算法的O复杂性(请参阅维基百科),这意味着它不会对减缓程序速度有太大贡献。

#include <stdio.h>
#include <stdlib.h>
int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}
int main()
{
  int a[3][3] = {{4,2,5}, {1,3,7}, {6,9,8}};
  qsort(a, 9, sizeof(int), compare);
  int i, j;
  for (i = 0; i < 3; ++i) {
    for (j = 0; j < 3; ++j)
      printf("%d ", a[i][j]);
    printf("n");
  }
  return 0;
}

如果您像int **a一样声明您的数组。那么也许你可以使用以下技术,这需要一些额外的内存:

int *a_mem = (int *)malloc(9 * sizeof(int));
int **a = (int **)malloc(3 * sizeof(int *));
for (i = 0; i < 3; ++i)
  a[i] = &a_mem[i * 3];
qsort(a_mem, 9, sizeof(int), compare);

最新更新