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

问题描述 投票:-3回答:3

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

假设给定的2D数组是

ebacd
fghij
olmkn
trpqs
xywuv

现在按照字典顺序排列后,阵列2D阵列就会出现

abcde
fghij
klmno
pqrst
uvwxy

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

c arrays
3个回答
1
投票

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


1
投票

你可能会使这个问题变得比它需要的更难。你有5阵列的5字符。只需为每个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

编辑 - 按注释水平和垂直排序

让我们从一个讨厌的混合数组开始:

    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

如果有更多的补充,他们将不得不等到早上:)


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

© www.soinside.com 2019 - 2024. All rights reserved.