每日一练——7-12 排序(25 分)

163 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

题目描述:

给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。

本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:只有1个元素;

  • 数据2:11个不相同的整数,测试基本正确性;

  • 数据3:10^3个随机整数;

  • 数据4:10^4个随机整数;

  • 数据5:10^5个随机整数;

  • 数据6:10^5个顺序整数;

  • 数据7:10^5个逆序整数;

  • 数据8:10^5个基本有序的整数;

  • 数据9:10^5个随机正整数,每个数字不超过1000。

输入格式:

输入第一行给出正整数N(≤105),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。

输出格式:

在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。

输入样例:

11
4 981 10 -17 0 -20 29 50 8 43 -5

输出样例:

-20 -17 -5 0 4 8 10 29 43 50 981

代码长度限制   16 KB

时间限制     400 ms

内存限制     64 MB PS: 这是一道25分的题目,用O(n²)的排序肯定是不行的,但是可以试试看,先来看看传统的冒泡排序~

传统冒泡排序:

#include<iostream>
using namespace std;

void Swap(int& a, int& b) {
    a = a - b;
    b = a + b;
    a = b - a;
}

void BubbleSort(int a[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                Swap(a[j], a[j + 1]);
            }
        }
    }
}

int main()
{
    int n;
    cin >> n;
    int* a = new int[n];
    for (int i = 0; i < n; i++)
        cin >> a[i];
    BubbleSort(a, n);
    cout << a[0];
    for (int i = 1; i < n; i++)
        cout << " " << a[i];
}

结果:

image.png
毫无疑问,超时了,再看看进阶的冒泡排序~(可以看我往期的冒泡排序的讲解)

进阶冒泡排序:

#include<iostream>
using namespace std;

void Swap(int& a, int& b) {
    a = a - b;
    b = a + b;
    a = b - a;
}

void BubbleSort(int a[], int n) {
    int exchange = n - 1;
    while (exchange) {
        int bound = exchange;
        exchange = 0;
        for (int i = 0; i < bound; i++) {
            if (a[i] > a[i + 1]) {
                Swap(a[i], a[i + 1]);
                exchange = i;
            }
        }
    }
}

int main()
{
    int n;
    cin >> n;
    int* a = new int[n];
    for (int i = 0; i < n; i++)
        cin >> a[i];
    BubbleSort(a, n);
    cout << a[0];
    for (int i = 1; i < n; i++)
        cout << " " << a[i];
}

结果:

image.png
爆炸依旧,O(n²)无法解出题目

PS: 这时尝试一下algorithm头文件的sort排序(是集中排序算法的综合体,排序效率很高)

sort排序:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int* a = new int[n];
    for (int i = 0; i < n; i++)
        cin >> a[i];
    sort(a, a + n);
    cout << a[0];
    for (int i = 1; i < n; i++)
        cout << " " << a[i];
}

结果:

image.png
代码结束,简洁完美~