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()的方法求解,比迭代和算——排——插都简单。

posted @ 2021-03-09 21:23  徐不二  阅读(86)  评论(0)    收藏  举报