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 ",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(" "); 53 return 0; 54 }
参考: