《算法笔记》4.1小节——算法初步->排序

@[TOC]

Contest100000581 - 《算法笔记》4.1小节——算法初步->排序

1、讲解

4.1 .1 选择排序

选择排序

4.1.2 插入排序

插入排序

4.1.3 排序题与sort()函数的应用

1.相关结构体的定义

相关结构体的应用

2.cmp函数的编写

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;
} 

你可能感兴趣的:(《算法笔记》4.1小节——算法初步->排序)