On Sort
这里主要归纳一下C++中数组的sort()函数。
sort函数的用法是:
#include <algorithm>
……
sort(firtst,end,cmp);
其中,first代表开始位置,end代表结束位置,cmp代表排序规则,可以自定义,也可以省略(默认非降序)。
可以自定义cmp函数对于一些非常规的排序情况十分友好,下面以一个题目进行说明。
题目描述
现有若干个考场,每个考场有若干考生。现在给出各个考场中考生的准考证号与分数,要求将所有考生按分数从高到低排序。
输入格式
首先输入考场数n,再输入该考场的人数,接着输入该考场中每个人的准考证号以及成绩。
输出格式
按照名次依次输出准考证号,排名,考场号以及考场内排名。
代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; struct Student{ char id[15]; int score; int locationNo;//考场号 int local_rank; int global_rank; }student[30010]; 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;//考场数 int gnum = 0;//总人数 int lnum;//某考场人数 scanf("%d",&n); for(int i=0;i<n;i++){//i为考场号 scanf("%d",&lnum); for(int j=0;j<lnum;j++){ scanf("%s %d",student[gnum].id,&student[gnum].score); student[gnum].locationNo = i; gnum++; } sort(student+gnum-lnum,student+gnum,cmp); student[gnum-lnum].local_rank = 1; int r = 2; for(int j=gnum-lnum+1;j<gnum;j++){ if(student[j].score==student[j-1].score){ student[j].local_rank = student[j-1].local_rank; } else{ student[j].local_rank = r; } r++; } } sort(student,student+gnum,cmp); student[0].global_rank = 1; int r = 2; for(int j=1;j<gnum;j++){ if(student[j].score==student[j-1].score){ student[j].global_rank = student[j-1].global_rank; } else{ student[j].global_rank = r; } r++; } for(int i=0;i<gnum;i++){ printf("%s ",student[i].id); printf("%d %d\n",student[i].local_rank,student[i].global_rank); } return 0; }
这种方法用的地方还是很多的,特别是用结构体的数据结构能够很好地降低时间复杂度。
比如:对一个二维数组进行排序,每一行代表的是一个数。
A[3,3]= { {2,2,2}, {1,2,2}, {3,1,1} };
排序后应该是
A[3,3]= { {1,2,2}, {2,2,2}, {3,1,1} };
这个题就可以使用结构体加sort()的方法求解,比迭代和算——排——插都简单。
浙公网安备 33010602011771号