文章目录

  • Contest100000581 - 《算法笔记》4.1小节——算法初步->排序
    • 1、讲解
      • 4.1 .1 选择排序
      • 4.1.2 插入排序
      • 4.1.3 排序题与sort()函数的应用
        • 1.相关结构体的定义
        • 2.cmp函数的编写
        • 3.排名的实现
    • 2、例题
      • PATA 1025:
    • 3、练习题
      • 1923 Problem A 排序
      • 1925 Problem B 特殊排序
      • 1926 Problem C EXCEL排序
      • 1927 Problem D 字符串内排序
      • 1978 Problem E Problem B
      • 2043 Problem F 小白鼠排队
      • 2069 Problem G 中位数
      • 2080 Problem H 整数奇偶排序
      • 2088 Problem I 排名

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 <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
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;elsereturn 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;i<k;i++)//输入学生信息 {scanf("%s %d",stu[count].id, &stu[count].score);stu[count].loc_number = (loc_sum-n);//赋值考场号 count++;}sort(stu+count-k,stu+count,cmp);stu[count-k].loc_rank = 1;//初始化各个考场排名 for(int j=count-k+1;j<count;j++)//赋予排名 {if(stu[j].score == stu[j-1].score)//如果与前一位考生同分 stu[j].loc_rank = stu[j-1].loc_rank;//排名也相同 else//不同分,排名为该考生前的人数 stu[j].loc_rank = j+1-(count-k);} }
//输出要求
/*
For each test case, first print in one line the total number of testees.
Then print the final ranklist in the following format:
registration_number final_rank location_number local_rank
*/ printf("%d\n",count);//输出所有考生人数total number sort(stu,stu+count,cmp);//所有考生排序int r = 1;//当前考生排名for(int i=0;i<count;i++){if(i>0 && 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 <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;int main()
{int arr[105];int n;while(scanf("%d",&n) != EOF){for(int i=0;i<n;i++){scanf("%d",&arr[i]);}sort(arr,arr+n);//sort()函数的使用for(int i=0;i<n-1;i++)printf("%d ",arr[i]);printf("%d\n",arr[n-1]);}return 0;
}

1925 Problem B 特殊排序

来自 http://codeup.cn/contest.php?cid=100000581

//1925ProblemB特殊排序
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;int main()
{int arr[1005];int n;while(scanf("%d",&n)!=EOF)//多点测试{for(int i=0;i<n;i++){scanf("%d",&arr[i]);}sort(arr,arr+n);//排序函数printf("%d ",arr[n-1]);if(n==1)//特殊情况的处理printf("%d\n",-1);else{for(int i=0;i<n-1;i++){printf("%d",arr[i]);if(i<n-2)printf(" ");elseprintf("\n");}    }}return 0;
}

1926 Problem C EXCEL排序

来自 http://codeup.cn/contest.php?cid=100000581
题析:模拟+sort+学生结构体 应用,很经典,字典序\同成绩之类的处理,strcmp(x,y)当x,y不相等时不为0,判断视为true

//1926ProblemCEXCEL排序
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
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,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数case 2://按姓名的非递减字典序排序if(!strcmp(x.name,y.name))return strcmp(x.id,y.id)<0;elsereturn strcmp(x.name,y.name)<0;break;case 3://按成绩的非递减排序if(x.grade!=y.grade)return x.grade<y.grade;elsereturn strcmp(x.id,y.id)<0;break;default:break;}/*
//当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。if(c==1)//按学号递增排序return strcmp(x.id,y.id)<0;//若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数else if(c==2)//按姓名的非递减字典序排序{if(!strcmp(x.name,y.name))return strcmp(x.id,y.id)<0;elsereturn strcmp(x.name,y.name)<0;}else if(c==3)//按成绩的非递减排序{if(x.grade!=y.grade)return x.grade<y.grade;elsereturn strcmp(x.id,y.id)<0;}*/
}
int main()
{int n;int count=1;while(scanf("%d%d",&n,&c) != EOF && n!=0){for(int i=0;i<n;i++){scanf("%s %s %d",stu[i].id,stu[i].name,&stu[i].grade);   } sort(stu,stu+n,cmp);printf("Case %d:\n",count++);for(int i=0;i<n;i++){printf("%s %s %d\n",stu[i].id, stu[i].name, stu[i].grade); }}return 0;
}

1927 Problem D 字符串内排序

来自 http://codeup.cn/contest.php?cid=100000581

题析:gets()/puts()应用,简单应用

//1927ProblemD字符串内排序
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
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 <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
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<m;i++){for(int j=0;j<m;j++){scanf("%d",&arr[i][j]);//输入方阵数据 sum_row[i]+=arr[i][j]; //求每行的和 //    cout<<sum_row[i]<<" ";//  cout<<endl; if(i==j)sum_duijiao[0]+=arr[i][j];//主对角线的和 if(i+j==m-1)sum_duijiao[1]+=arr[i][j];//次对角线的和 sum_column[j] += arr[i][j];//求每列的和,对于列下标j
//  sum_column[int(j%(m-1))] += arr[i][j];//错误做法,没有搞清楚下标的机制 }//    cout<<sum_column[i]<<" ";//   cout<<endl; //    sum_ce+=sum_row[i];}//    cout<<sum_ce<<endl;int k=0;//最终数组的下标指针 //赋值转移给最终数组 for(int i=0;i<m;i++){sum[k++]=sum_row[i];  } for(int i=0;i<m;i++){sum[k++]=sum_column[i]; } for(int i=0;i<2;i++){sum[k++]=sum_duijiao[i];    } sort(sum,sum+k,cmp);//排序 for(int i=0;i<k;i++)//输出 {printf("%d",sum[i]);if(i<k-1)printf(" ");elseprintf("\n");}}return 0;
} 

2043 Problem F 小白鼠排队

来自 http://codeup.cn/contest.php?cid=100000581
题析:
struct{}arr[];结构体、sort排序
注意结构体的排序规则

//2043ProblemF小白鼠排队
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
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<N;i++)//输入信息 scanf("%d%s",&mou[i].weight,mou[i].color);sort(mou,mou+N,cmp);//排序 for(int i=0;i<N;i++)//输出信息 printf("%s\n",mou[i].color);
//      printf("\n");}return 0;
}

2069 Problem G 中位数

来自 http://codeup.cn/contest.php?cid=100000581
题析:
进行模拟,得注意数组下标的处理,从0开始与从1处理
从1开始的数组下标有利于奇偶处理。

//2069ProblemG中位数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
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 <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;bool cmp_even(int x,int y)
{return x>y;
}
bool cmp_odd(int x,int y)
{return x<y;
}
int main()
{int num[15];while(scanf("%d%d%d%d%d%d%d%d%d%d",&num[0],&num[1],&num[2],&num[3],&num[4],&num[5],&num[6],&num[7],&num[8],&num[9]) != EOF){int even_cnt=0,odd_cnt=0,cnt=0;int even[10]={0},odd[10]={0};for(int i=0;i<10;i++){if(num[i]%2==0)//偶数odd[odd_cnt++]=num[i];else//奇数 even[even_cnt++]=num[i]; }sort(even,even+even_cnt,cmp_even);//奇数从大到小排序for(int i=0;i<even_cnt;i++)//从大到小输出奇数 printf("%d ",even[i]);sort(odd,odd+odd_cnt,cmp_odd);//偶数排序 for(int i=0;i<odd_cnt-1;i++)//从小到大输出偶数 printf("%d ",odd[i]);printf("%d\n",odd[odd_cnt-1]); }return 0;
}

2088 Problem I 排名

来自 http://codeup.cn/contest.php?cid=100000581
题析:
M、N不分,题中许多注释都是测试用的,因为M、N搞混了,注意细节的处理

//2088ProblemI排名
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
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;elsereturn 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<<M<<endl;for(int i=0;i<N;i++)//输入处理 {stu[i].grade=0;scanf("%s%d",&stu[i].id,&stu[i].sol_p_n);//   cout<<stu[i].sol_p_n<<endl;for(int j=0;j<stu[i].sol_p_n;j++)//输入解决的题 {scanf("%d",&stu[i].p_id[j]);stu[i].grade += course_grad[stu[i].p_id[j]];//  cout<<stu[i].grade<<endl;}      if(stu[i].grade>=G)pass_cnt++;//  cout<<pass_cnt<<endl;// cout<<i<<endl;//    cout<<"46532"<<endl;}//   cout<<"1312222"<<endl;printf("%d\n",pass_cnt);sort(stu,stu+N,cmp);for(int i=0;i<N;i++){if(stu[i].grade >= G)printf("%s %d\n",stu[i].id,stu[i].grade);}}return 0;
} 

Contest100000581 - 《算法笔记》4.1小节——算法初步-排序相关推荐

  1. 机器学习算法笔记——P22 sklearn—LASSO算法

    机器学习算法笔记--P22 sklearn-LASSO算法 #!/usr/bin/env python # coding: utf-8# In[1]:import numpy as np from n ...

  2. 算法笔记:Kmeans聚类算法简介

    算法笔记:Kmeans聚类算法简介 1. Kmeans算法简介 2. Kmeans算法细节 3. Kmeans算法收敛性证明 4. Kmeans算法的变体 1. cosine距离变体 2. 点积距离版 ...

  3. 算法笔记习题 2-9小节

    算法笔记@Ada_Lake 算法笔记代码保留地~~~ 2.9小节--C/C++快速入门->补充 有关cin 和 cout cout 中控制 double型 的精确度 - 1. 加入#includ ...

  4. 算法笔记习题 7-1小节

    算法笔记@Ada_Lake 算法笔记代码保留地~~~ 7.1小节--提高篇->数据结构专题->栈的应用 首先讲了一下栈的定义.即栈就通俗而言即先进先出.每个栈都有一个栈顶指针来指向栈的最上 ...

  5. 【算法笔记题解】《算法笔记知识点记录》第三章——入门模拟1——简单模拟

    如果喜欢大家还希望给个收藏点赞呀0.0 相关知识点大家没基础的还是要看一下的,链接: <算法笔记知识点记录>第三章--入门模拟 由于放原题的话文章实在太长,所以题多的话我只放思路和题解,大 ...

  6. 【算法笔记5.6小节 -大整数运算 】问题 C: 浮点数加法

    题目描述 求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2...Pi.Q1Q2...Qj 对于整数部分,P1P2...Pi是一个非负整数 对于小数部分,Qj不等于0 输入 对 ...

  7. 经典算法笔记:无监督算法(聚类、降维)

    本文是吴恩达老师的机器学习课程[1]的笔记和代码复现部分(聚类.降维). 作者:黄海广[2] 备注:笔记和作业(含数据.原始作业文件).视频都在github[3]中下载. 我将陆续将课程笔记和课程代码 ...

  8. 算法笔记 (四)算法的逻辑结构和物理结构

    逻辑 逻辑一词在定义的时候有狭义和广义之分.      狭义的逻辑可以理解为思维逻辑,再大一点就是研究思维活动规律的学科,即逻辑学. 广义的概念不仅仅指思维方面,还指事物客观规律.从形式上又分为形式逻 ...

  9. 算法笔记:A2-A4-RSRQ切换算法

    1 LTE 切换 LTE切换是移动通信网络中的一个过程,移动设备在保持无间断服务的情况下,将其连接从一个基站切换到另一个基站.当移动设备离开当前基站的覆盖范围或网络资源拥塞时,就需要进行切换. LTE ...

  10. 数据结构/算法笔记(1)-两种排序 二分查找

    快速排序 确定分界点:在数组中选一个元素的值 x x x 作为分界,(某人说)可任取 (重点)调整区间:以 x x x 为准,将数组分为左右两段,通过换位保证左边都≤x,右边都≥x,即可 递归分别处理 ...

最新文章

  1. 3dmax图像采样器抗锯齿_内幕揭秘!同样的场景同一张图,用3DMAX网渲平台进行二次渲染时间竟然相差3个小时之多!...
  2. iOS进阶之路由MGJRouter-1(13)
  3. UA MATH567 高维统计I 概率不等式3 亚高斯性与亚高斯范数
  4. obs可以推到中转服务器吗,[经验分享]OBS 如何实现多路推流
  5. 解决 WPF 绑定集合后数据变动界面却不更新的问题(使用 ObservableCollection)
  6. 还在用Excel做数据分析?两大方法5分钟完成别人一天的工作
  7. Coursera自动驾驶课程第8讲:Basics of 3D Computer Vision
  8. pixel和毫米怎么换算_赶紧收藏!小学阶段所有公式、单位换算、数量关系
  9. 【今日CV 视觉论文速览】 07 Dec 2018
  10. 万字长文!分布式锁的实现全都在这里了
  11. warpctc error
  12. 53. Using a Custom Admin URL
  13. 线性规划问题的目标函数灵敏度分析
  14. Excel表格中超链接转图片
  15. 认识卷积神经网络(卷积层和池化层)
  16. Linux服务器之Redis集群搭建
  17. Java压缩背景透明图片后图片背景变成黑底
  18. 网络工程管理 第七章 应用层协议 万维网 DNS 电子邮件 FTP DHCP TELNET
  19. Linux网卡固件,CentOS下X710网卡升级驱动和固件脚本 | 聂扬帆博客
  20. 锐取录播服务器咋样进系统界面,锐取录播系统

热门文章

  1. (三十)《汇编语言(王爽)》 | 检测点 17.1
  2. jsPlumb.draggable()设置id时所遇问题
  3. 全概率公式和逆概率公式(贝叶斯公式)
  4. CSS篇一——(2)
  5. 不要松散。自己再追悔愧疚。
  6. c语言之判断电压最大值最小值,《单片机和C语言编程》..ppt
  7. 课程标准模板 java,实训(Web)课课程标准模板
  8. 通过unix时间戳获得两个时间相差多少自然日
  9. 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题
  10. DHCP Snooping应用