1045 快速排序
Statement
Metadata
- 作者: CAO, Peng
- 单位: Google
- 代码长度限制: 16 KB
- 时间限制: 200 ms
- 内存限制: 64 MB
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的
例如给定
- 1 的左边没有元素,右边的元素都比它大,所以它可能是主元;
- 尽管 3 的左边元素都比它小,但其右边的 2 比它小,所以它不能是主元;
- 尽管 2 的右边元素都比它大,但其左边的 3 比它大,所以它不能是主元;
- 类似原因,4 和 5 都可能是主元。
因此,有 3 个元素可能是主元。
输入格式
输入在第 1 行中给出一个正整数
输出格式
在第 1 行中输出有可能是主元的元素个数;在第 2 行中按递增顺序输出这些元素,其间以 1 个空格分隔,行首尾不得有多余空格。
输入样例
输出样例
Solution
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100000
int a[MAXN][2], b[MAXN];
int main() {
int n, i, j, min, max;
cin >> n;
scanf("%d", &a[0][0]);
max = a[0][0];
a[0][1] = 1;
for (i = 1; i < n; i++) {
scanf("%d", &a[i][0]);
a[i][1] = 1;
if (a[i][0] < max)
a[i][1] = 0;
else
max = a[i][0];
}
min = a[n - 1][0];
for (i = n - 2; i >= 0; i--) {
if (a[i][0] > min)
a[i][1] = 0;
else
min = a[i][0];
}
for (i = 0, j = 0; i < n; i++) {
if (a[i][1])
b[j++] = a[i][0];
}
sort(b, b + j);
printf("%d\n", j);
if (j)
printf("%d", b[0]);
for (i = 1; i < j; i++) printf(" %d", b[i]);
printf("\n");
}
Last update: May 4, 2022