我想对这样的二维数组进行排序:
4 2 5
1 3 7
6 9 8
获得这样的:
1 2 3
4 5 6
7 8 9
使用语言C。
解决此问题的几个选项可能包括:
有人建议here,我可以使用一维索引来定义或使用函数来访问每个值,并使用插入排序或冒泡排序。
ARRAY(索引)数组[(索引)/ 3] [(索引)%3]
我不喜欢任何一个选项,因为第一个需要一个临时空间,第二个可能很慢。我的二维数组在行和列中会很大。我也很懒,想知道我是否可以使用qsort的标准C库函数。好像我不能使用带有2-D数组的qsort来获得所有元素的结果,就像1-D数组一样。
我获得了一个2-D数组,所以将它转换为1-D数组对我来说不是一个选择。
感谢您的任何建议。
答案 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),这意味着它对减慢程序没有太大作用。