多重排序【今日题记】

多重排序

需要对多个条件进行排序,因此可以称之为多重排序。

题目

在这里插入图片描述

某生物实验室记录了n种(n<=1000)病毒信息,每种病毒都有编号、传染性和致病性三个基本信息,编号是1000-9999的人工编号,其中的传染性和致病性是用0-100的数值代表其严重程度。请你帮实验室完成这些病毒信息的处理,即按传染性升序排序,若传染性相同则按致病性降序排序。

输入格式:
多组输入。每组先输入一个正整数n(1<=n && n <= 100),代表有n种病毒,接下来分别输入每种病毒的信息,即编号number(1000-9999)、传染性Pi(0-100)、致病性Di(0-100)。

提示:以条件 scanf(“%d”,&n)!=EOF 来确定是否结束多组数据的输入。

输出格式:
对于每组数据输出n行,每行三个数值,空格分隔开,分别是number、Pi、Di。

输入样例:
在这里给出一组输入。例如:

3
1001 10 30
1006 5 60
2001 30 12
4
1001 10 30
1006 5 20
2001 30 12
1008 5 60

输出样例:
在这里给出相应的输出。例如:

result:
1006 5 60
1001 10 30
2001 30 12
result:
1008 5 60
1006 5 20
1001 10 30
2001 30 12

分析

具体来说,这道题需要根据以下条件进行排序:

  • 主要条件:按照传染性(Pi)升序排序。
  • 次要条件:如果传染性(Pi)相同,则按照致病性(Di)降序排序。

这种多重排序要求根据多个字段进行排序,当主要条件相同时,使用次要条件来决定顺序。这样的排序通常会在数据处理、数据库查询和某些竞赛问题中出现。

思路

  1. 使用结构体来存储数据
    在这里插入图片描述
typedef struct
{
   
    int number; /* 病毒id */
    int Pi;
    int Di;
}
Virus;
  1. 排序:
  • Pi升序
    在这里插入图片描述
	// 冒泡排序:if(arr[i] > arr[j]) swap(arr[i], arr[j]);
	if(arr[i].Pi > arr[j].Pi) swap(arr[i], arr[j]);
  • Pi相同,则比较Di,Di降序
    在这里插入图片描述
if(arr[i].Pi == arr[j].Pi && arr[i].Di < arr[j].Di) swap;

综合两种情况,那么当满足条件((p + i)->Pi > (p + j)->Pi) || (((p + i)->Pi == (p + j)->Pi) && ((p + i)->Di < (p + j)->Di))时,swap

代码
void sort(Virus* p, int len)
{
   
    // 冒泡排序; 1. Pi升序 2. Pi相同,则比较Di,Di降序
    for(int i = 0; i < len - 1; ++i)
    {
   
        for(int j = i + 1; j < len; ++j)
        {
   
            // 冒泡排序:if(arr[i] > arr[j]) swap
            if((
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值