算法学习——排序(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Marilynmontu/article/details/81987604

问题 A: 排序
时间限制: 1 Sec 内存限制: 32 MB

题目描述
对输入的n个数进行排序并输出。

输入
输入的第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。

输出
可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。
每组测试数据的结果占一行。

样例输入
5
5 4 3 1 2
样例输出
1 2 3 4 5

解题思路
本题采用冒泡排序来解决,虽然速度很慢,此处主要是用于记录该方法。冒泡排序的本质在于交换,即每次通过交换的方式把当前剩余元素的最大值移动到一端,当剩余元素减少为0时,排序结束。

Submission

#include <stdio.h>
#include <string.h>
int main() {
    int a[101];
    int i,j,n;
    int temp;
    while(scanf("%d",&n)!=EOF){
        for(i=0;i<n;i++){
        scanf("%d",&a[i]);
        }
        for(j=1;j<=n-1;j++){
        for(i=0;i<n-j;i++){
            if(a[i]>a[i+1]){
                temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
                }   
            }
        } 
        for(i=0;i<n;i++)
        {
            printf("%d ",a[i]);
        }
        printf("\n");
    }
    return 0;
}

问题 B: 特殊排序
时间限制: 1 Sec 内存限制: 32 MB

题目描述
输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序。

输入
输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。
接下来的一行有N个整数。
输出
可能有多组测试数据,对于每组数据,
第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。
第二行将排序的结果输出。
样例输入
5
5 3 2 4 1
样例输出
5
1 2 3 4
提示
如果数组中只有一个数,当第一行将其输出后,第二行请输出”-1”。

解题思路
此题采用选择排序进行排序,先排序,后去除掉最大值。本题比较容易卡壳的地方是读错题目,我一直以为要去掉所有重复的最大值,最后发现只要去掉最后一个最大值,忧伤.jpg。

Submission

#include <stdio.h>
#include <string.h>
int main() {
    int i,j,n;
    int temp=0;
    while(scanf("%d",&n)!=EOF){
        int a[2000]={0};
        for(i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        for(i=0;i<n;i++){
            int k=i;
            for(j=i;j<n;j++){
                if(a[j]<a[k])
                k=j;
            }
            if(k!=i){
                temp=a[k];//交换a[k]与a[i] 
                a[k]=a[i];
                a[i]=temp;
            }
        }
        if(n!=1){
            printf("%d \n",a[n-1]);
            for(i=0;i<n;i++)
            {
                if(i!=n-2){
                    printf("%d ",a[i]);
                }
                else if(i==n-2){
                    printf("%d\n",a[i]);
                    break;
                }
            }

        } 
        else{
            printf("%d \n",a[0]);
            printf("-1\n");
        }

    } 
    return 0;
}

由于考试中的排序题大部分都只需要得到排序的最终结果,而不需要去写排序的完整过程,因此可以直接使用C语言中的库函数qsort或是C++中的sort函数进行排序,此题直接用sort函数的解法如下:

Submission

#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {

    int n;
    int buf[1000];
    while (scanf("%d", &n) != EOF) {

        for (int i=0; i<n; i++) {
            scanf("%d", &buf[i]);
        }

        sort(buf, buf+n);

        printf("%d\n", buf[n-1]);

        if (n == 1) {
            printf("-1\n");
        } else {
            for (int i=0; i<n-1; i++) {
                if (i==n-2) {
                    printf("%d\n", buf[i]);
                } else {
                    printf("%d ", buf[i]);
                }
            }
        }

    }
    return 0;
}

问题 C: EXCEL排序
时间限制: 1 Sec 内存限制: 32 MB

题目描述
Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。
对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
输入
测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (N<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。

输出
对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。

样例输入
4 1
000001 Zhao 75
000004 Qian 88
000003 Li 64
000002 Sun 90
4 2
000005 Zhao 95
000011 Zhao 75
000007 Qian 68
000006 Sun 85
4 3
000002 Qian 88
000015 Li 95
000012 Zhao 70
000009 Sun 95
0 3
样例输出
Case 1:
000001 Zhao 75
000002 Sun 90
000003 Li 64
000004 Qian 88
Case 2:
000007 Qian 68
000006 Sun 85
000005 Zhao 95
000011 Zhao 75
Case 3:
000012 Zhao 70
000002 Qian 88
000009 Sun 95
000015 Li 95

解题思路
这道题很常规,问题类型属于结构体的比较。主要解决两个问题,一是交换排序的排序准则,二是将两个结构体的位置进行交换。

Submission

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct student{
    char id[10];
    char name[10];
    int score;
}stu[100010];
bool cmp_score(student a, student b){
    if(a.score != b.score) return a.score < b.score;
    else return strcmp(a.id, b.id) < 0;
}
bool cmp_id(student a, student b){
    return strcmp(a.id, b.id) < 0;
}
bool cmp_name(student a, student b){
    if(strcmp(a.name, b.name)) return strcmp(a.name, b.name) < 0;  //之前把判断条件写成了(a.name != b.name),在C++中可以用string直接进行比较,但是char数组之间的比较必须使用strcmp函数。
    else return strcmp(a.id, b.id) < 0;
}
int main(){
    int i,n,c,num;
    num=0;
    while(scanf("%d %d",&n,&c)&&n!=0){
        num++;
        for(i=0; i<n; i++){
            scanf("%s %s %d", &stu[i].id, &stu[i].name, &stu[i].score);
        }
        if(c==1){
            sort(stu, stu+n, cmp_id);
        }
        else if(c==2){
            sort(stu, stu+n, cmp_name);
        }
        else if(c==3){
            sort(stu, stu+n, cmp_score);
        }
        printf("Case %d:\n", num);
        for(i=0; i<n; i++){
            printf("%s %s %d \n" ,stu[i].id, stu[i].name, stu[i].score);
        }

    }
    return 0;
}

问题 D: 字符串内排序
时间限制: 1 Sec 内存限制: 32 MB

题目描述
输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串。

输入
测试数据有多组,输入字符串。

输出
对于每组输入,输出处理后的结果。

样例输入
tianqin
样例输出
aiinnqt
提示
注意输入的字符串中可能有空格。

解题思路
运用插入排序进行排序,只是变换一下数据类型。

Submission

#include<stdio.h>
#include<string.h>
int main(){
    char str[201];
    int i, j, k;
    while(gets(str)){
        j = 0;
        for( i = 1 ; i < strlen (str) ; i++){
            char temp = str[i];
            int j = i;
            while(j > 0 && temp < str[j-1]){
                str[j] = str[j-1];
                j--;
            }
            str[j] = temp;                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
        }
        printf("%s\n",str);
    }

    return 0;
}

这些题目都很简单啊,先巩固一遍基础再刷复杂的逻辑题比较好~

猜你喜欢

转载自blog.csdn.net/Marilynmontu/article/details/81987604