1.选择排序
void selectsort(){
//n次循环,每次都会使有序长度加一
for(int i=1;i<=n;i++){
//k代表的是最小元素的下标,在[i,n]的区间中,先让k为左端点i
int k = i;
//不断和后面的元素比较,找到最小的元素下标
for(int j=i+1;j<=n;j++){
if(a[j]<a[k]){
k = j;
}
}
//交换i位置和最小元素的位置,也就是k
int temp=a[i];
a[i] = a[k];
a[k] = temp;
}
}
2.插入排序
void insertsort(){
//[2,n]区间的元素进行排序
for(int i=2;i<=n;i++){
//用pos和temp分别记录此次需要排序的坐标和值
int temp=martix[i],pos=i;
//如果pos前一个位置的值大于pos所在的值,那么pos往前移动,该值则往后移动到pos所在的位置
//因为区间是[1,n].所以pos-1要大于等于1,所以pos要大于1
while(temp<martix[pos-1]&&pos>1){
martix[pos] = martix[pos-1];
pos--;
}
//已经找到pos的位置,将该位置设置为一开始记录的temp值
martix[pos] = temp;
}
}
3.排序题
3.1结构体的定义
3.2cmp函数
3.2.1strcmp函数以及字典序
3.2排名
4.PAT Ranking
遇到了一个很奇怪的bug,num++的位置
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
struct student{
char id[15];
int score;
int loc_num;
int final_rank;
int local_rank;
}stu[30005];
bool cmp(student a,student b){
//如果分数不同,那么分数高的在前面
if(a.score!=b.score) return a.score>b.score;
//如果分数相同,那么字典序小的在前面
else return strcmp(a.id,b.id)<0;
}
int main(){
//考场数
int n;
scanf("%d",&n);
int loc,num=0;
for(int i=0;i<n;i++){
//考场号
scanf("%d",&loc);
//对该考场考生的信息进行输入,顺便根据i的值把考场号输入
for(int j=0;j<loc;j++){
scanf("%s %d",&stu[num].id,&stu[num].score);
stu[num].loc_num=i+1;
num++;
}
//以下是对该考场的考生进行排序
//loc_start是该考场第一个考生在该结构体数组中的位置坐标,而num则是最后一个考生坐标+1
int loc_start = num-loc;
sort(stu+loc_start,stu+num,cmp);
stu[loc_start].local_rank=1;
//记录名次
for(int j=loc_start+1;j<num;j++){
if(stu[j].score==stu[j-1].score) stu[j].local_rank=stu[j-1].local_rank;
else stu[j].local_rank = j-loc_start+1;
}
}
//对整体进行排序,求最终名次
sort(stu,stu+num,cmp);
stu[0].final_rank=1;
for(int i=1;i<num;i++){
if(stu[i].score==stu[i-1].score) stu[i].final_rank=stu[i-1].final_rank;
else stu[i].final_rank=i+1;
}
printf("%d\n",num);
for(int i=0;i<num;i++){
printf("%s %d %d %d\n",stu[i].id,stu[i].final_rank,stu[i].loc_num,stu[i].local_rank);
}
return 0;
}