我必须编写一个函数来对数组中的结构进行排序。其结构是:
#define MAX_USERNAME_LENGTH 16
typedef struct{
char username[MAX_USERNAME_LENGTH];
unsigned int rides;
unsigned int rank;
} driver;程序从.txt文件加载数据并填充数组。
driver driver_list[256]我必须按等级和乘车次数对driver_list进行排序。所以如果我的文件包含
//user rides rank
frank209 3 6
john76 7 6
harry99 2 2
bob77 5 2产出必须显示:
john76 7 6
frank209 3 6
bob77 5 2
harry99 2 2有办法这么做吗?我尝试过使用2嵌套for进行选择排序,但在输出中,我看到列表仅按秩或骑行排序。谢谢你的帮助
发布于 2019-08-24 12:43:20
使用标头qsort中声明的标准函数<stdlib.h>,并编写用户定义的比较函数。
给你。
#include <stdio.h>
#include <stdlib.h>
#define MAX_USERNAME_LENGTH 10
typedef struct
{
char username[MAX_USERNAME_LENGTH];
unsigned int rides;
unsigned int rank;
} driver;
int cmp( const void *left, const void *right )
{
const driver *a = ( const driver *)left;
const driver *b = ( const driver *)right;
if ( b->rank < a->rank )
{
return -1;
}
else if ( a->rank < b->rank )
{
return 1;
}
else
{
return ( a->rides < b->rides ) - ( b->rides < a->rides );
}
}
int main(void)
{
enum { N = 4 };
driver driver_list[N] =
{
{ "frank209", 3, 6 },
{ "john76", 7, 6 },
{ "harry99", 2, 2 },
{ "bob77", 5, 2 }
};
qsort( driver_list, N, sizeof( driver ), cmp );
for ( size_t i = 0; i < N; i++ )
{
printf( "%s, %u, %u\n",
driver_list[i].username, driver_list[i].rides, driver_list[i].rank );
}
return 0;
}程序输出是
john76, 7, 6
frank209, 3, 6
bob77, 5, 2
harry99, 2, 2发布于 2019-08-24 13:19:47
这里的一个关键概念是记录“先于”另一个记录意味着什么。它不是把这看作排序算法的一个特性--排序是如何构造成按多个字段排序的--而是记录之间关系的一个特征。您将只有一个常规的排序算法,但是它在排序顺序中“更早”的标准使用了记录的两个字段。如果一个记录有更高的级别,或者,如果它的等级相同,那么如果它有更多的乘车次数,那么它就被确定为领先于另一个记录。
一旦你知道“之前”是什么意思,你就会有一种有序的关系。那么任何类型的方法都可以。您只需使用所选的顺序进行排序。
如果您使用的是C标准的qsort,您将编写一个比较函数:
const void的指针,这是qsort接口所必需的。如果您正在编写自己的排序,则仍然使用上面的比较过程。
https://stackoverflow.com/questions/57637855
复制相似问题