如何在C中按字典顺序对2D字符数组进行排序?

时间:2017-12-25 04:58:43

标签: c arrays

我想按字典顺序对2D数组进行排序。

假设给定的2D数组是

ebacd
fghij
olmkn
trpqs
xywuv

现在按照字典顺序排列后,数组2D数组将是

abcde
fghij
klmno
pqrst
uvwxy

请提供一个逻辑,以便我可以解决这个问题。提供的数组行数和列数相同。

3 个答案:

答案 0 :(得分:1)

存储前26个素数。 有一个数字m = 1 现在对于矩阵中的每个字母,将m乘以素数[letter]。 现在按顺序遍历矩阵,并将m除以第1个素数,直到它不再被2整除。(继续添加'a'),然后继续添加'b',直到m不再被3整除,等等。

答案 1 :(得分:1)

你可能会使这个问题变得比它需要的更难。您每个都有55个字符数组。只需为每个qsort字符数组调用5一次,然后对它们进行排序,例如

#include <stdio.h>
#include <stdlib.h>

/* integer comparison (adapt for all numeric types) */
int cmpint (const void *a, const void *b)
{
    /* (a > b) - (a < b) */
    return (*(char *)a > *(char *)b) - (*(char *)a < *(char *)b);
}

int main (void) {

    char a[][5] = { "ebacd",
                    "fghij",
                    "olmkn",
                    "trpqs",
                    "xywuv"};
    int n = sizeof a / sizeof *a;

    for (int i = 0; i < n; i++)
        qsort (a[i], 5, sizeof *a[i], cmpint);

    for (int i = 0; i < n; i++) {
        printf ("a[%d] : ", i); 
        for (int j = 0; j < 5; j++)
            putchar (a[i][j]);
        putchar ('\n');
    }

    return 0;
}

示例使用/输出

$ ./bin/qsort2dchar
a[0] : abcde
a[1] : fghij
a[2] : klmno
a[3] : pqrst
a[4] : uvwxy

编辑 - 按评论水平&amp;垂直排序

让我们从一个讨厌的混合阵列开始:

    char a[][5] = { "ebacd",
                    "trpqs",
                    "olmkn",
                    "fghij",
                    "xywuv"};

现在让我们再添加一个qsort来对其进行排序:

#include <stdio.h>
#include <stdlib.h>

/* integer comparison (adapt for all numeric types) */
int cmpint (const void *a, const void *b)
{
    /* (a > b) - (a < b) */
    return (*(char *)a > *(char *)b) - (*(char *)a < *(char *)b);
}

int main (void) {

    char a[][5] = { "ebacd",
                    "trpqs",
                    "olmkn",
                    "fghij",
                    "xywuv"};
    int n = sizeof a / sizeof *a;

    for (int i = 0; i < n; i++)          /* sort horizontal */
        qsort (a[i], 5, sizeof *a[i], cmpint);

    qsort (a, 5, sizeof *a, cmpint);    /* sort vertical */

    for (int i = 0; i < n; i++) {
        printf ("a[%d] : ", i); 
        for (int j = 0; j < 5; j++)
            putchar (a[i][j]);
        putchar ('\n');
    }

    return 0;
}

示例使用/输出

$ ./bin/qsort2dchar
a[0] : abcde
a[1] : fghij
a[2] : klmno
a[3] : pqrst
a[4] : uvwxy

如果可能出现多个角色,则进行完全词汇排序

正如评论中指出的那样,如果不是包含唯一出现的字符的5个字符的每个数组,那么数组可能包含重复字符(在单个数组中或行之间),然后单独检查第一个字符对于垂直排序是不够的。

添加第二个比较,它将检查每个字符并根据第一个不匹配返回,如果所有字符在被比较的行之间相同,则返回零,无论内容如何,​​您都可以对数组进行完全词典排序。以下内容添加了cmpnchr函数来完成相同的操作。

考虑输入数组:

    char a[][NCHR] = {  "ebaca",
                        "traqb",
                        "olmkn",
                        "facib",
                        "xywuv"};

完整的排序需要:

#include <stdio.h>
#include <stdlib.h>

#define NCHR 5

/* integer comparison (adapt for all numeric types) */
int cmpint (const void *a, const void *b)
{
    /* (a > b) - (a < b) */
    return (*(char *)a > *(char *)b) - (*(char *)a < *(char *)b);
}

int cmpnchr (const void *a, const void *b)
{
    const char  *pa = a,
                *pb = b;
    int i = 0;

    for (; i < NCHR; i++)
        if (pa[i] > pb[i])
            return 1;
        else if (pa[i] < pb[i])
            return -1;

    return 0;
}

int main (void) {

    char a[][NCHR] = {  "ebaca",
                        "traqb",
                        "olmkn",
                        "facib",
                        "xywuv"};
    int n = sizeof a / sizeof *a;

    for (int i = 0; i < n; i++)          /* sort horizontal */
        qsort (a[i], NCHR, sizeof *a[i], cmpint);

    qsort (a, NCHR, sizeof *a, cmpnchr); /* vertical sort */

    for (int i = 0; i < n; i++) {
        printf ("a[%d] : ", i);
        for (int j = 0; j < NCHR; j++)
            putchar (a[i][j]);
        putchar ('\n');
    }

    return 0;
}

示例使用/输出

$ ./bin/qsort2dcharfull
a[0] : aabce
a[1] : abcfi
a[2] : abqrt
a[3] : klmno
a[4] : uvwxy

如果还有其他内容,则必须等到早上:)

答案 2 :(得分:0)

你可以定义两个比较函数,一个用于水平比较,另一个用于垂直比较:

typedef char Row[COLUMNS];
int compareVertical(const void *a, const void *b)
{
    return (*(Row *)a)[0] - (*(Row *)b)[0];
}

int compareHorizon(const void *a, const void *b)
{
    return *(char *)a - *(char *)b;
}

首先对行进行排序,然后对循环中的每一行进行排序,如下所示:

qsort(arr, ROWS, sizeof(Row), compareVertical);

for (int row = 0; row < ROWS; ++row)
{
    qsort(arr[row], COLUMNS, sizeof(char), compareHorizon);
}

点击此处查看完整代码:https://ideone.com/b7rvQh