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

时间:2016-08-14 08:13:22

标签: 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

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

感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用此排序功能对第二列的矩阵进行排序:

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 **)上,所以没有区别,但为了保持一致性和可读性,建议使用正确的类型。