Skip to content

14276: 【原4276】小可怜要排序

题目

题目描述

author: 小可怜 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/4276

小可怜要排序

Description

助教是个小可怜,因为她不知道要出什么机考题了。 然后她发现大家已经学完了指针和函数模板,欣喜若狂。 她用腻了STL库中的排序,想要手写排序玩一玩,所以她出了这道题,顺便让大家体会一下下学期数据结构不能用STL的机考氛围。 小可怜助教读入了一列东西,想让你写一个排序函数,完成她想要的排序: - 0 将一列整数从小到大排序; - 1 将一列整数从大到小排序; - 2 将一列字符串从小到大排序; - 3 将一列字符串从大到小排序。

小可怜助教已经在给定的sample.cpp里写好了四个操作所需要的比较函数。

要求如下: - 只允许写一个排序函数sort。 - 禁止修改或重写sample.cpp中已经给定的部分,包括读入、函数调用、输出,请根据所给出的函数调用写代码,已给代码保证所有的读入、输出部分不会导致错误、超时等问题。 - 禁止使用任何C++自带的可用于排序的函数。禁止使用除代码中给定的库以外的库(如要使用请务必提前询问助教)。 - 给定sample.cpp中开的数组大小保证够用。整数序列排序的最大数据范围为$1 \leq n \leq 10^5$,字符串序列的最大数据范围为$1 \leq n \leq 10^3$。 - 保证按要求调用比较函数不会发生答案错误!字符串的比较方式详见给定的比较函数。 - 不限制使用的排序算法,但请记住时间限制为1s,我们允许你使用复杂度较高的算法以获得部分分。 - 请使用指向函数的指针函数模板完成代码。 - 你只有一次提交本题的机会!!! - 请严格按照以上要求完成此题。我们会检查你提交的代码。虽然有其他的实现方式,但如果你未按照要求写代码,我们不会给你对应的分数。 - 同时,此题需要你注意提交代码的代码风格!!!极为糟糕的代码风格(例如改变语法的某些宏定义)会酌情扣分!!!

Input Format

第一行一个整数$op$,表示小可怜助教想要的操作数。 第二行一个整数$n$,表示一列数字/字符串的个数。 第三行$n$个数字/字符串。

Output Format

一行表示排完序的数列/字符串列。

SAMPLE INPUT 1

0
5
1 5 3 4 2

SAMPLE OUTPUT 1

1 2 3 4 5

SAMPLE INPUT 2

3
5
aaa bbb ccc ddd eee

SAMPLE OUTPUT 2

eee ddd ccc bbb aaa

Hint

sample.cpp如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;

int n = 0;
int a[1000005] = {0};
string str[1005];

//TODO
//sort

bool IncreaseInt(int x,int y) { return x < y; }
bool DecreaseInt(int x,int y) { return y < x; }
bool IncreaseString(string x, string y) { return x < y; }
bool DecreaseString(string x, string y) { return y < x; }

int main()
{
    //主程序中仅此处允许添加必要的代码。其余部分不可修改。
    int op;
    char chh[100];
    scanf("%d",&op);
    switch (op)
    {
        case 0:
            scanf("%d",&n);
            for (int i=0;i<n;++i) scanf("%d",&a[i]);
            sort(a,0,n-1,IncreaseInt);
            for (int i=0;i<n;++i) printf("%d ",a[i]);
            break;
        case 1:
            scanf("%d",&n);
            for (int i=0;i<n;++i) scanf("%d",&a[i]);
            sort(a,0,n-1,DecreaseInt);
            for (int i=0;i<n;++i) printf("%d ",a[i]);
            break;
        case 2:
            scanf("%d",&n); cin.getline(chh,90);
            for (int i=0;i<n;++i) cin >> str[i];
            sort(str,0,n-1,IncreaseString);
            for (int i=0;i<n;++i) cout << str[i] << " ";
            break;
        case 3:
            scanf("%d",&n); cin.getline(chh,90);
            for (int i=0;i<n;++i) cin >> str[i];
            sort(str,0,n-1,DecreaseString);
            for (int i=0;i<n;++i) cout << str[i] << " ";
            break;
    }
    return 0;
}

请大家仔细阅读以上给定的sample.cpp,相信大家只要认真听课,就一定能写出来( ̄︶ ̄)

Oops! 本题目还没有解答!

助教老师们编题的速度,已经超过了解题的速度!

OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。

如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!