首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种方法可以根据C中的多个变量对结构进行排序?

是否有一种方法可以根据C中的多个变量对结构进行排序?
EN

Stack Overflow用户
提问于 2019-08-24 12:15:08
回答 2查看 2.4K关注 0票数 3

我必须编写一个函数来对数组中的结构进行排序。其结构是:

代码语言:javascript
复制
#define MAX_USERNAME_LENGTH 16

typedef struct{
 char username[MAX_USERNAME_LENGTH];
 unsigned int rides;
 unsigned int rank;
} driver;

程序从.txt文件加载数据并填充数组。

代码语言:javascript
复制
driver driver_list[256]

我必须按等级和乘车次数对driver_list进行排序。所以如果我的文件包含

代码语言:javascript
复制
//user rides rank
frank209 3 6
john76 7 6
harry99 2 2
bob77 5 2

产出必须显示:

代码语言:javascript
复制
john76 7 6
frank209 3 6
bob77 5 2
harry99 2 2

有办法这么做吗?我尝试过使用2嵌套for进行选择排序,但在输出中,我看到列表仅按秩或骑行排序。谢谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-24 12:43:20

使用标头qsort中声明的标准函数<stdlib.h>,并编写用户定义的比较函数。

给你。

代码语言:javascript
复制
#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;
}

程序输出是

代码语言:javascript
复制
john76, 7, 6
frank209, 3, 6
bob77, 5, 2
harry99, 2, 2
票数 3
EN

Stack Overflow用户

发布于 2019-08-24 13:19:47

这里的一个关键概念是记录“先于”另一个记录意味着什么。它不是把这看作排序算法的一个特性--排序是如何构造成按多个字段排序的--而是记录之间关系的一个特征。您将只有一个常规的排序算法,但是它在排序顺序中“更早”的标准使用了记录的两个字段。如果一个记录有更高的级别,或者,如果它的等级相同,那么如果它有更多的乘车次数,那么它就被确定为领先于另一个记录。

一旦你知道“之前”是什么意思,你就会有一种有序的关系。那么任何类型的方法都可以。您只需使用所选的顺序进行排序。

如果您使用的是C标准的qsort,您将编写一个比较函数:

  • 获取指向const void的指针,这是qsort接口所必需的。
  • 将这些指针转换为指向结构的指针。
  • 如果第一个结构的秩大于第二个结构,则返回一个负值(意为“早期”)。如果级别较低,则返回一个正值(“稍后”)。
  • 否则,军衔是平等的。如果第一个结构有更多的游程,则返回一个负值。如果数量较少,则返回正值。如果它们相同,则返回零。

如果您正在编写自己的排序,则仍然使用上面的比较过程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57637855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档