我想按字典顺序对2D数组进行排序。
假设给定的2D数组是
ebacd
fghij
olmkn
trpqs
xywuv
现在按照字典顺序排列后,数组2D数组将是
abcde
fghij
klmno
pqrst
uvwxy
请提供一个逻辑,以便我可以解决这个问题。提供的数组行数和列数相同。
答案 0 :(得分:1)
存储前26个素数。 有一个数字m = 1 现在对于矩阵中的每个字母,将m乘以素数[letter]。 现在按顺序遍历矩阵,并将m除以第1个素数,直到它不再被2整除。(继续添加'a'),然后继续添加'b',直到m不再被3整除,等等。
答案 1 :(得分: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
编辑 - 按评论水平&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