C - 按特定列对 3d 字符串数组进行排序

标签 c arrays sorting

我有对 3d 字符串数组进行排序的代码示例。

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

static char * rand_string(size_t ssize)
{
    char * str = malloc(sizeof(char) * ssize);
    const char charset[] = "abcdefghijklmnopqrstuvwxyz";
    if (ssize) {
        --ssize;
        for (size_t n = 0; n < ssize; n++) {
            int key = rand() % (int) (sizeof charset - 1);
            str[n] = charset[key];
        }
        str[ssize] = '\0';
    }
    return str;
}

char *** init_array(char *** array, int n_rows, int n_cols, int ssize)
{
    int i, j;
    array = malloc(n_rows * sizeof(char **));
    for (i = 0; i < n_rows; i++)
    {
        array[i] = malloc(n_cols * sizeof(char *));
        for (j = 0; j < n_cols; j++)
            array[i][j] = malloc(ssize * sizeof(char));
    }
    return array;
}

void gen_array(char *** array, int n_rows, int n_cols, int ssize)
{
    int i, j, k;
    for (i = 0; i < n_rows; i++)
        for (j = 0; j < n_cols; j++)
            snprintf(array[i][j], ssize, "%s", rand_string(ssize));
}

int str_compare(const void * a, const void * b)
{
    const char *pa = **(const char ***) a;
    const char *pb = **(const char ***) b;

//    printf("debug: a = %s\n", **(const char ***) a);
    return strcmp(pa, pb);
}

void print_array(char *** array, int n_rows, int n_cols)
{
    int i, j;
    for (i = 0; i < n_rows; i++) {
        for (j = 0; j < n_cols; j++)
            printf("%s ", array[i][j]);
        printf("\n");
    }
}

int main(void)
{
    int n_rows = 3, n_cols = 5, ssize = 10;
    char *** z;

    z = init_array(z, n_rows, n_cols, ssize);
    gen_array(z, n_rows, n_cols, ssize);
    print_array(z, n_rows, n_cols);
    printf("\n");
    qsort(z, 3, sizeof(char *), str_compare);
    print_array(z, n_rows, n_cols);

    return 0;
}

输出如下,原始数组和排序数组在哪里(这些是示例值,随机性无关紧要):

nwlrbbmqb hcdarzowk kyhiddqsc dxrjmowfr xsjybldbe 
fsarcbyne cdyggxxpk lorellnmp apqfwkhop kmcoqhnwn 
kuewhsqmg bbuqcljji vswmdkqtb xixmvtrrb ljptnsnfw 

fsarcbyne cdyggxxpk lorellnmp apqfwkhop kmcoqhnwn 
kuewhsqmg bbuqcljji vswmdkqtb xixmvtrrb ljptnsnfw 
nwlrbbmqb hcdarzowk kyhiddqsc dxrjmowfr xsjybldbe

我正在寻找一种按另一列(第二列或第三列)排序的方法。可能吗?

谢谢。

最佳答案

您可以使用此排序函数沿矩阵的第二列对矩阵进行排序:

int str_compare2(const void * a, const void * b) {
    const char *pa = ((const char ***)a)[0][1];
    const char *pb = ((const char ***)b)[0][1];

    return strcmp(pa, pb);
}

1 更改为 2 将沿第三列排序,依此类推

请注意,您应该以这种方式调用 qsort:

qsort(z, 3, sizeof(char **), str_compare);

zchar ** 的数组,而不是 char *。在大多数架构上,sizeof(char*) == sizeof(char **),因此没有区别,但为了一致性和可读性,建议使用正确的类型。

关于C - 按特定列对 3d 字符串数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38940390/

相关文章:

c - 有没有办法让 gcc 或 clang 对显式强制转换发出警告?

c - 指针未更新

c - 如何在 C99 中迭代 char*?

javascript - 如何按正整数或负整数对数组进行排序

powershell - 在 Powershell 中对路径列表进行排序

objective-c - 静态库不想使用.h文件只想使用.a文件

c - 对 byte 和 int 进行按位运算

javascript - 交换任意 3D 数组值

arrays - 如何查找至少出现 K 次的数组项

java - 按特定顺序对列表列表进行排序