如何在C中按降序对结构数组进行排序

How to sort array of structs by descending order in C

这些是我的结构:

struct create{
    char names[30];
    int Win;
    int Lose;
    int Draw;
    int Points;
    int Average;
    int Goals;
};

所以,我正在寻找一种方法来按降序对它们进行排序。就像,根据 int Win 如果 Win 比 other 高,它应该在顶部。

例如:

Name - Win - Lose - Draw ...
Joe  -  2  -   0  -  0 ...
Bill -  1  -   0  -  1 ...
Mike -  0  -   1  -  1 ...

可能吗?谁能帮我解决这个问题。

典型的排序类似于:

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

struct create {
        char name[30];
        int Win;
};

int
comp(const void *va, const void *vb)
{
        const struct create *a = va;
        const struct create *b = vb;
        return a->Win > b->Win ? 1 : b->Win > a->Win ? -1 : 0;
}

int
main(void)
{
        struct create ar[] = {
                { .name = "a", .Win = 5 },
                { .name = "b", .Win = 7 },
                { .name = "c", .Win = 3 },
                { .name = "d", .Win = -1 },
                { .name = "e", .Win = 5 },
                { .name = "f", .Win = 8 }
        };
        qsort(ar, sizeof ar / sizeof *ar, sizeof *ar, comp);
        for( unsigned i = 0; i < sizeof ar / sizeof *ar; i++ ) {
                printf(" %s: %d\n", ar[i].name, ar[i].Win);
        }

        return 0;
}

使用在 header <stdlib.h> 中声明的标准 C 函数 qsort 创建适当的比较函数。

给你。

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

struct create{
    char names[30];
    int Win;
    int Lose;
    int Draw;
    int Points;
    int Average;
    int Goals;
};

int cmp( const void *a, const void *b )
{
    const struct create *left  = a;
    const struct create *right = b;

    return ( left->Win < right->Win ) - ( right->Win < left->Win );  
}

int main(void) 
{
    struct create a[] =
    {
        { .names = "Mike", .Win = 0, .Lose = 1, .Draw = 1 },
        { .names = "Joe",  .Win = 2, .Lose = 0, .Draw = 0 },
        { .names = "Bill", .Win = 1, .Lose = 0, .Draw = 1 },
    };

    const size_t N = sizeof( a ) / sizeof( *a );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%-4s %d %d %d\n", a[i].names, a[i].Win, a[i].Lose, a[i].Draw );
    }

    putchar( '\n' );

    qsort( a, N, sizeof( struct create ), cmp );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%-4s %d %d %d\n", a[i].names, a[i].Win, a[i].Lose, a[i].Draw );
    }

    putchar( '\n' );

    return 0;
}

程序输出为

Mike 0 1 1
Joe  2 0 0
Bill 1 0 1

Joe  2 0 0
Bill 1 0 1
Mike 0 1 1

天呐!!!您没有以精确的方式指定任何内容……您几乎没有显示任何代码,没有完整的示例,也没有工作代码。请阅读 this page 了解如何在 Whosebug 中 post。我假设您正在使用 qsort() 按升序对数组进行排序,并使用一些名为 comparator1() 的函数,并假设该函数定义为:

int comparator1(void *a, void *b);

比较结构以便按升序排序。只需编写另一个函数:

int comparator2(void *a, void *b) 
{
    return -comparator1(a, b);
}

并将第二个比较器函数传递给对 qsort() 的调用。您将得到与以前相反的顺序排列的数组。这样,您只需选择一个函数或另一个函数即可控制顺序是升序还是降序。 :)