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

时间:2013-11-30 01:13:31

标签: c sorting multidimensional-array quicksort bubble-sort

我想对这样的二维数组进行排序:

4 2 5
1 3 7
6 9 8

获得这样的:

1 2 3
4 5 6
7 8 9

使用语言C。

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

  1. 将输入二维数组转换为一维数组,并使用标准库函数,例如sort。
  2. 有人建议here,我可以使用一维索引来定义或使用函数来访问每个值,并使用插入排序或冒泡排序。

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

  3. 我不喜欢任何一个选项,因为第一个需要一个临时空间,第二个可能很慢。我的二维数组在行和列中会很大。我也很懒,想知道我是否可以使用qsort的标准C库函数。好像我不能使用带有2-D数组的qsort来获得所有元素的结果,就像1-D数组一样。

    我获得了一个2-D数组,所以将它转换为1-D数组对我来说不是一个选择。

    感谢您的任何建议。

2 个答案:

答案 0 :(得分:2)

#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);

答案 1 :(得分:2)

正如gongzhitaao在他的评论中提到的,如果数组被定义为int`a [n] [m]`,那么它被定义为内存中的连续块,因为它可以被访问,好像它是一个通过提供指向第一个元素的指针并提供n * m作为数组长度的维数组。 您可以在问题http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c/4810668和http:// stackoverflow中找到有关数组如何工作的更详细说明。 COM /问题/ 7949589 / 2D阵列-VS-阵列的阵列。

如果情况并非如此,使用访问功能是最佳选择,原因有两个:
1.这是最直观的做法。如果将数组定义为int* a[n],那么可以有n个非连续数组的指针。这意味着,除非你为它定义一个函数,否则你必须告诉我们接下来会有哪些元素(用于排序)。 它根本不慢。您选择的任何排序算法中唯一的变化是用新的访问函数(a[i])替换每个一维数组访问(getArrayElement(a,i,j))。函数本身很小,甚至可能在编译期间内联,因此唯一的开销是计算,这是每次访问两个额外的算术函数。因为不会改变算法的O复杂度(参见Wikipedia),这意味着它对减慢程序没有太大作用。