1045 快速排序 (25分)

输入样例:
5 1 3 2 4 5
输出样例:
3 1 4 5思路:1.首先找可能主元,将所给数组排序然后对比初始数组,找到主元2.对所有可能主元,从左到右遍历一遍初始数组找最大值,将所有可能主元的左侧最大值存储3.对所有可能主元,从右到左遍历一遍初始数组找最小值,将所有可能主元的右侧最小值存储4.可能主元满足主元元素大于左侧最大值小于右侧最小值,则判定为主元5.测试点2输出主元个数为0,但是要输出两个换行,否则会有格式错误(即,输出主元的那行为空,但还要再换一行)首次通过代码:

1 #include<stdio.h>
2 #include<stdlib.h>
3 int a[100005];
4 int b[100005];
5 int maybe[100005];
6 int max[100005];
7 int min[100005];
8 int cmp(const void *a,const void *b){
9 return *(int *)a-*(int *)b;
10 }
11
12 int main(){
13 int sum;
14 scanf("%d",&sum);
15 for(int i=0;i<sum;i++)
16 {scanf("%d",&a[i]);
17 b[i]=a[i];
18 }
19 qsort(b,sum,sizeof(int),cmp);
20 int num=0;
21 for(int i=0;i<sum;i++){
22 if(a[i]==b[i]) maybe[num++]=a[i];
23 }
24 int counter=0;
25 int max_num=0;int min_num=1e9+1;
26 for(int i=0;i<sum;i++){
27 if(a[i]==maybe[counter]){
28 max[counter++]=max_num;
29 }
30 else if(a[i]>max_num) max_num=a[i];
31 }
32 counter--;
33 for(int i=sum-1;i>=0;i--){
34 if(a[i]==maybe[counter]){
35 min[counter--]=min_num;
36 }
37 else if(a[i]<min_num) min_num=a[i];
38 }
39 int num1=0;
40 for(int i=0;i<num;i++){
41 if(maybe[i]>max[i]&&maybe[i]<min[i]) num1++;
42 }
43 printf("%d\n",num1);
44 for(int i=0;i<num;i++){
45 if(maybe[i]>max[i]&&maybe[i]<min[i]) {
46 printf("%d",maybe[i]);
47 num1--;
48 if(num1>0) printf(" ");
49 }
50
51 }
52 printf("\n");
53 return 0;
54 }
参考:
来源:https://www.cnblogs.com/a982961222/p/12410917.html
