本文主要是介绍洛谷: P1177【模板】排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
将读入的 N 个数从小到大排序后输出。
输入格式
第一行为一个正整数 N。
第二行包含 N 个空格隔开的正整数 ai,为你需要进行排序的数。
输出格式
将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。
输入输出样例
输入 #1复制
5 4 2 4 5 1
输出 #1复制
1 2 4 4 5
思路
试了一下最左边当基准,emmm有一个样例TLE了,还是应该取中间或者随机取一个都可以AC。另外开足够大的空间。
C++生成随机数参见博客园C++产生随机数
代码1
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int N, a[maxn];
void kuaipai(int s,int e) {int index = a[(s+e)/2];int i = s, r = e;while (i <= r) {while (a[i] < index) i++;while (a[r] > index) r--;if (i <= r) {swap(a[i], a[r]);i++;r--;}}if (s < r) kuaipai(s, r);if (i < e) kuaipai(i, e);
}
int main() {cin >> N;for (int i = 0; i < N; i++)cin >> a[i];kuaipai(0, N - 1);for (int i = 0; i < N; i++)cout << a[i] << " ";return 0;
}
代码2
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int N, a[maxn];
int randint(int l,int r) {return rand() % (r - l + 1) + l;
}
void kuaipai(int s,int e) {int index = a[randint(s,e)];int i = s, r = e;while (i <= r) {while (a[i] < index) i++;while (a[r] > index) r--;if (i <= r) {swap(a[i], a[r]);i++;r--;}}if (s < r) kuaipai(s, r);if (i < e) kuaipai(i, e);
}
int main() {cin >> N;for (int i = 0; i < N; i++)cin >> a[i];kuaipai(0, N - 1);for (int i = 0; i < N; i++)cout << a[i] << " ";return 0;
}
这篇关于洛谷: P1177【模板】排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!