PAT乙级1045-----快速排序 (25分)

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 }
View Code

参考:

FROM:https://www.cnblogs.com/Anber82/p/11353212.html

猜你喜欢

转载自www.cnblogs.com/a982961222/p/12410917.html