题目
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元?
例如给定 N = 5 N = 5 N=5, 排列是1、3、2、4、5。则:
1 的左边没有元素,右边的元素都比它大,所以它可能是主元;
尽管 3 的左边元素都比它小,但其右边的 2 比它小,所以它不能是主元;
尽管 2 的右边元素都比它大,但其左边的 3 比它大,所以它不能是主元;
类似原因,4 和 5 都可能是主元。
因此,有 3 个元素可能是主元。
输入格式:
输入在第 1 行中给出一个正整数
N
(
≤
1
0
5
)
N(≤10^5)
N(≤105); 第 2 行是空格分隔的 N 个不同的正整数,每个数不超过
1
0
9
10^9
109
。
输出格式:
在第 1 行中输出有可能是主元的元素个数;在第 2 行中按递增顺序输出这些元素,其间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
5
1 3 2 4 5
输出样例:
3
1 4 5
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 100010;
int q_1[MAXN], q_2[MAXN], n, a[MAXN], k = 0, Max = 0;
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &q_1[i]);
q_2[i] = q_1[i];
}
sort(q_1, q_1 + n);
for(int i = 0; i < n; i++){
if(q_1[i] == q_2[i] && q_2[i] > Max) a[k++] = q_2[i];
if(q_2[i] > Max) Max = q_2[i];
}
printf("%d\n", k);
for(int i = 0; i < k; i++) printf("%s%d", i ? " " : "", a[i]);
printf("\n");
return 0;
}

该博客讨论了快速排序算法中的主元选取问题。通过分析一个排列示例,解释了如何确定可能的主元,并给出了C++代码实现来找出并输出所有可能的主元。代码实现了对输入数组的排序,然后判断哪些元素可以作为划分时的主元,并按升序输出这些元素。

242

被折叠的 条评论
为什么被折叠?



