@[TOC]
Contest100000581 - 《算法笔记》4.1小节——算法初步->排序
1、讲解
4.1 .1 选择排序
4.1.2 插入排序
4.1.3 排序题与sort()函数的应用
1.相关结构体的定义
2.cmp函数的编写
3.排名的实现
2、例题
PATA 1025:
https://pintia.cn/problem-sets/994805342720868352/problems/994805474338127872
题析:很经典的题目,值得反复咀嚼
//1025PAT Ranking
#include
#include
#include
#include
using namespace std;
struct student//学生结构体
{
char id[15];//准考证号
int score;
int loc_number;//考场号
int loc_rank;
}stu[30005];
/*
//The output must be sorted in nondecreasing order of the final ranks.
The testees with the same score must have the same rank, and the output
must be sorted in nondecreasing order of their registration numbers.
*/
bool cmp(student x,student y)//排序规则
{
if(x.score != y.score)
return x.score>y.score;
else
return strcmp(x.id,y.id)<0;
}
int main()
{
int n;
scanf("%d",&n);
int loc_sum=n;
int count=0;
while(n--)
{
int k;//各个考场人数
scanf("%d",&k);
// int count=0;//总数
for(int i=0;i0 && stu[i].score != stu[i-1].score)
r = i+1;
printf("%s ",stu[i].id);//registration_number
//location_number local_rank
printf("%d %d %d\n",r, stu[i].loc_number,stu[i].loc_rank);
}
return 0;
}
3、练习题
1923 Problem A 排序
来自 http://codeup.cn/contest.php?cid=100000581
题析:可以方便使用sort()函数
//1923ProblemA排序
#include
#include
#include
#include
using namespace std;
int main()
{
int arr[105];
int n;
while(scanf("%d",&n) != EOF)
{
for(int i=0;i
1925 Problem B 特殊排序
来自 http://codeup.cn/contest.php?cid=100000581
//1925ProblemB特殊排序
#include
#include
#include
using namespace std;
int main()
{
int arr[1005];
int n;
while(scanf("%d",&n)!=EOF)//多点测试
{
for(int i=0;i
1926 Problem C EXCEL排序
来自 http://codeup.cn/contest.php?cid=100000581
题析:模拟+sort+学生结构体 应用,很经典,字典序\同成绩之类的处理,strcmp(x,y)当x,y不相等时不为0,判断视为true
//1926ProblemCEXCEL排序
#include
#include
#include
#include
using namespace std;
struct student
{
char id[10];//学号
char name[10];//姓名
int grade;//成绩
}stu[100005];
int c;
int cmp(student x,student y)
{
switch(c)
{//当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
case 1://按学号递增排序
return strcmp(x.id,y.id)<0;break;//若str1=str2,则返回零;若str1str2,则返回正数
case 2://按姓名的非递减字典序排序
if(!strcmp(x.name,y.name))
return strcmp(x.id,y.id)<0;
else
return strcmp(x.name,y.name)<0;
break;
case 3://按成绩的非递减排序
if(x.grade!=y.grade)
return x.gradestr2,则返回正数
else if(c==2)//按姓名的非递减字典序排序
{
if(!strcmp(x.name,y.name))
return strcmp(x.id,y.id)<0;
else
return strcmp(x.name,y.name)<0;
}
else if(c==3)//按成绩的非递减排序
{
if(x.grade!=y.grade)
return x.grade
1927 Problem D 字符串内排序
来自 http://codeup.cn/contest.php?cid=100000581
题析:gets()/puts()应用,简单应用
//1927ProblemD字符串内排序
#include
#include
#include
#include
using namespace std;
int main()
{
char str[205];
while(gets(str)!=NULL)
{
int len = strlen(str);
sort(str,str+len);
// printf("%s\n",str);
puts(str);
}
return 0;
}
1978 Problem E Problem B
来自 http://codeup.cn/contest.php?cid=100000581
题析:注意数组下标指针的意义,
隐含多点测试??(单点测试错误50%)
Sort()函数的应用
//1978ProblemEProblem B
#include
#include
#include
#include
using namespace std;
int arr[15][15];
bool cmp(int x,int y)//从大到小的比较法则
{
return x>y;
}
int main()
{
int m;
while(scanf("%d",&m)!=EOF)//单点测试???
{
int sum_row[15]={0},sum_column[15]={0},sum_duijiao[2]={0};//行、列、对角和存储矩阵
int sum[25]={0};//最终和存储矩阵
int row_cnt=0,col_cnt=0,dj_cnt=0;//数组下标指针
int sum_ce=0;
for(int i=0;i
2043 Problem F 小白鼠排队
来自 http://codeup.cn/contest.php?cid=100000581
题析:
struct{}arr[];结构体、sort排序
注意结构体的排序规则
//2043ProblemF小白鼠排队
#include
#include
#include
#include
using namespace std;
struct mouse//老鼠结构体
{
int weight;//体重
char color[15];//帽子颜色
}mou[105];
//bool cmp(int x,int y)//错误
bool cmp(mouse x,mouse y)//正确排序规则
{
return x.weight>y.weight;
}
int main()
{
char color[105];
int N;
while(scanf("%d",&N) != EOF)//多点输入
{
for(int i=0;i
2069 Problem G 中位数
来自 http://codeup.cn/contest.php?cid=100000581
题析:
进行模拟,得注意数组下标的处理,从0开始与从1处理
从1开始的数组下标有利于奇偶处理。
//2069ProblemG中位数
#include
#include
#include
#include
using namespace std;
int main()
{
int num[10005];
int N;
while(scanf("%d",&N) != EOF && N!=0)//多点测试
{
// getchar();//消除换行符的影响
// memset(num,0,sizeof(num));//初始化数组,可有可无
int result;
for(int i=1;i<=N;i++)//注意下标从1开始有助于下面处理
scanf("%d",&num[i]);
sort(num+1,num+N+1);//排序 ,上限为num+N+1,若为num+N,错误50%
if(N%2==0)//偶数,中间两个数
{
result = (num[N/2]+num[N/2+1])/2;
}
else//奇数,中间一个数
{
result = num[(N+1)/2];
}
printf("%d\n",result);
}
return 0;
}
2080 Problem H 整数奇偶排序
来自 http://codeup.cn/contest.php?cid=100000581
题析:
奇偶处理,sort()应用,注意下标初始化
多点测试的输入形式
//2080ProblemH整数奇偶排序
#include
#include
#include
#include
using namespace std;
bool cmp_even(int x,int y)
{
return x>y;
}
bool cmp_odd(int x,int y)
{
return x
2088 Problem I 排名
来自 http://codeup.cn/contest.php?cid=100000581
题析:
M、N不分,题中许多注释都是测试用的,因为M、N搞混了,注意细节的处理
//2088ProblemI排名
#include
#include
#include
#include
using namespace std;
struct student
{
char id[25];//准考证号
int sol_p_n;//解决题目数
int p_id[15];//解决题目题号
int grade;//成绩
}stu[1005];
bool cmp(student x,student y)
{
if(x.grade!=y.grade)
return x.grade>y.grade;
else
return strcmp(x.id,y.id)<0;
}
int main()
{
int N,M,G;
int course_grad[15]={0};
while(scanf("%d%d%d",&N,&M,&G) != EOF && N!=0)
{
int pass_cnt=0;
for(int i=1;i<=M;i++)//各科分数
scanf("%d",&course_grad[i]);
// int count=0;
// cout<=G)
pass_cnt++;
// cout<= G)
printf("%s %d\n",stu[i].id,stu[i].grade);
}
}
return 0;
}