按第一维排序二维数组(C)

时间:2017-10-22 02:35:39

标签: c arrays sorting

我有一个二维数组,我试图按升序排序。例如,假设数组如下所示:

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;
}

1 个答案:

答案 0 :(得分:2)

如果你确实有一个int的二维数组,那么按行排序数组的关键是要理解在排序过程中,你需要交换 ,而不仅仅是价值观。这是在排序过程中保留行方式关系的方法。

您无法将int的每一行视为字符串,并尝试使用strcpy进行行式复制。当strcpy访问数组边界外的src参数中的值,寻找 nul-terminatedating 字符时,这将导致 Undefined Behavior 39;目前。

(虽然从技术上讲,为每个srcdest提供正确大小的数组,并在'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; } 是首选方法,但对于学习而言,手工获取经验并没有错。如果您还有其他问题,请与我们联系。