我想按字典顺序对2D数组进行排序。
假设给定的2D数组是
ebacd
fghij
olmkn
trpqs
xywuv
现在按照字典顺序排列后,阵列2D阵列就会出现
abcde
fghij
klmno
pqrst
uvwxy
请给我一个逻辑,以便我可以解决这个问题。提供的数组行数和列数相同。
存储前26个素数。现在对于矩阵中的每个字母都有一个数字m = 1,将m乘以素数[letter]。现在按顺序遍历矩阵,并将m除以第1个素数,直到它不再被2整除。(继续添加'a'),然后继续添加'b',直到m不再被3整除,等等。
你可能会使这个问题变得比它需要的更难。你有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
如果有更多的补充,他们将不得不等到早上:)
您可以定义两个比较功能,一个用于水平比较,另一个用于垂直比较:
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