多重排序
-
- 多重排序
-
- 题目
- 分析
- 思路
-
- 代码
- 代码
- 结构体知识
多重排序
需要对多个条件进行排序,因此可以称之为多重排序。
题目
某生物实验室记录了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)降序排序。
这种多重排序要求根据多个字段进行排序,当主要条件相同时,使用次要条件来决定顺序。这样的排序通常会在数据处理、数据库查询和某些竞赛问题中出现。
思路
- 使用结构体来存储数据
typedef struct
{
int number; /* 病毒id */
int Pi;
int Di;
}
Virus;
- 排序:
- 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((