-1

2 つの char 配列を含むディクショナリという名前の構造があるとします。2番目のchar配列に従って、辞書型配列「ペア」を昇順にソートしたい。ソート機能を使用してそれを行う方法は?コンプをどのように変更する必要がありますか?

4

1 に答える 1

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

typedef struct
{
    unsigned char message[100];   // string to be sorted
                                  // (totally arbitrary length)
    unsigned char sortOrder[256]; // string containing ASCII chars
                                  // in their sort order
} Pair;

unsigned char rank[256]; // rank of each ASCII character

// qsort() comparison function
int sortByRank(const void *a, const void *b)
{
    return ((int)rank[*(signed char *)a] - (int)rank[*(signed char *)b]);
}

// Creates an array by which a character's relative position can be found
// solely from its value.  Characters of rank 0 will appear first when sorted.
// Characters not specified by sortOrder will appear first, since rank is
// global and automatically initialized to zeros.
void initRank(Pair pair)
{
    int i;

    for (i = 0; i < strlen(pair.sortOrder); i++)
        rank[pair.sortOrder[i]] = i;

    return;
}

int main()
{
    // Create an example pair.  Spaces will be the first characters in the
    // sorted result.
    Pair pair;
    strcpy(pair.message, "this is a test message (123).");
    strcpy(pair.sortOrder, " 321abcdefghijklm.nopqrstuvwxyz()");

    // In this solution, initRank() will need to be called any time the
    // sortOrder is changed.
    initRank(pair); 

    // Sort using the global rank array set by initRank()
    qsort(pair.message, strlen(pair.message), sizeof(char), sortByRank);

    printf("Sorted message: %s\n", pair.message);

    // Output:
    // Sorted message:      321aaeeeghiim.sssssttt()

    return 0;
}

rank[] はグローバルであるため、これはそれほどエレガントではありませんが、上記のソリューションは一般に、C のソート関数を使用して 2 番目の文字列に基づいてカスタム ソートを行う方法をかなり簡単に示しています。

于 2013-01-12T16:55:46.313 に答える