持续创作,加速成长!这是我参与「掘金日新计划 · 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];
}
结果:
毫无疑问,超时了,再看看进阶的冒泡排序~(可以看我往期的冒泡排序的讲解)
进阶冒泡排序:
#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];
}
结果:
爆炸依旧,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];
}
结果:
代码结束,简洁完美~