我有一个二维数组,我试图按升序排序。例如,假设数组如下所示:
4, 5
2, 6
7, 2
8, 4
我希望它看起来像这样:
2, 6
4, 5
7, 2
8, 4
到目前为止我的代码:
int temp = 0;
for(int m = 0; m<=nonZeroLength-1; m++){
for(int n = m+1; n<=nonZeroLength-1; n++){
if(nonZeroScoreSorcting[m] > nonZeroScoreSorcting[m+1]){
temp = nonZeroScoreSorcting[m];
strcpy(nonZeroScoreSorcting[m], nonZeroScoreSorcting[n]);
strcpy(nonZeroScoreSorcting[n], temp);
}
}
}
假设此示例中nonZeroLength
的值为4。我正在使用strcpy()
,因为我读到这是在C中更改数组元素的唯一方法。当我运行程序时,我收到以下错误:
从不兼容的指针类型[-Wincompatible-pointer-types]传递'strcpy'的参数1
我也尝试了常规分配方法:
if(nonZeroScoreSorcting[m] > nonZeroScoreSorcting[m+1]){
temp = nonZeroScoreSorcting[m];
nonZeroScoreSorcting[m] = nonZeroScoreSorcting[n];
nonZeroScoreSorcting[n] = temp;
}
答案 0 :(得分:2)
如果你确实有一个int
的二维数组,那么按行排序数组的关键是要理解在排序过程中,你需要交换行 ,而不仅仅是价值观。这是在排序过程中保留行方式关系的方法。
您无法将int
的每一行视为字符串,并尝试使用strcpy
进行行式复制。当strcpy
访问数组边界外的src
参数中的值,寻找 nul-terminatedating 字符时,这将导致 Undefined Behavior 39;目前。
(虽然从技术上讲,为每个src
和dest
提供正确大小的数组,并在'n'
中调整strncpy
以复制{{1}字节可以通过将读取限制为2 * sizeof(int)
字符来复制行,其中不存在 nul-terminatedating 字符 - 但是DON&#39; T这样做 - 那个&#39;是n
(或memcpy
)的用途。
虽然推荐的C排序方法是使用memmove
中提供的qsort
函数,但您可以提供所需的任何排序算法。它可能不会接近stdlib.h
的效率,并且肯定不会接近彻底的测试。使用慢旧插入排序的简单行排序可以按如下方式进行:
qsort
示例使用/输出
#include <stdio.h>
#include <string.h>
int main (void) {
int a[][2] = {{ 4, 5 },
{ 2, 6 },
{ 7, 2 },
{ 8, 4 }},
n = sizeof a / sizeof *a,
col = sizeof *a / sizeof **a;
for (int i = 0; i < n; i++) /* insertion sort of a by row */
for (int j = i; j > 0 && *a[j] < *a[j-1]; j--) {
int tmp[col]; /* temporary VLA */
memcpy (tmp, a[j], sizeof *a);
memcpy (a[j], a[j-1], sizeof *a);
memcpy (a[j-1], tmp, sizeof *a);
}
for (int (*p)[2] = a; p < a + n; p++) /* output results */
printf ("%d, %d\n", (*p)[0], (*p)[1]);
return 0;
}
对于$ ./bin/inssort2d
2, 6
4, 5
7, 2
8, 4
,大多数新的C程序员都不得不写一个 compare 函数来传递给qsort
以让它完成它的工作。这根本不是那么困难。您知道qsort
将指向您正在排序的两个指针作为比较函数的参数。
在这种情况下,您将根据每行的第一个元素对整数行(1D整数数组)进行排序。所以qsort
将比较两个qsort
(指向int的指针)。您只关心每个数组中的第一个元素(只需通过取消引用指针即可获得)。这里的比较可以很简单:
int *
(注意:通过使用两个不等式的结果,您可以防止在仅仅返回减法结果时可能发生的上溢/下溢。)
完整的int cmp (const void *a, const void *b)
{
/* (a > b) - (a < b) */
return (*(int *)a > *(int *)b) - (*(int *)a < *(int *)b);
}
实施将是:
qsort
(输出相同)
查看这两种方法并知道#include <stdio.h>
#include <stdlib.h>
int cmp (const void *a, const void *b)
{
/* (a > b) - (a < b) */
return (*(int *)a > *(int *)b) - (*(int *)a < *(int *)b);
}
int main (void) {
int a[][2] = {{ 4, 5 },
{ 2, 6 },
{ 7, 2 },
{ 8, 4 }},
n = sizeof a / sizeof *a;
qsort (a, n, sizeof *a, cmp); /* qsort array of pointers */
for (int (*p)[2] = a; p < a + n; p++) /* output results */
printf ("%d, %d\n", (*p)[0], (*p)[1]);
return 0;
}
是首选方法,但对于学习而言,手工获取经验并没有错。如果您还有其他问题,请与我们联系。