如何在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()
的调用。您将得到与以前相反的顺序排列的数组。这样,您只需选择一个函数或另一个函数即可控制顺序是升序还是降序。 :)
这些是我的结构:
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()
的调用。您将得到与以前相反的顺序排列的数组。这样,您只需选择一个函数或另一个函数即可控制顺序是升序还是降序。 :)