5214: 交叉排序Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 364 Solved: 182[Submit][Status][Web Board]
Description现在我们有 N 个数,他想先将数组中第 l1 到第 r1 的数字按从小到大的顺序排序。再将数组中第 l2 到第 r2 的数字按从大到小的顺序排序。这里的数组从 1 开始计数。我们帮他算一算数组排序后的结果吧~
Input第一行五个整数 N, l1, r1, l2, r2,其中 0 < l1 < r1 < N, 0 < l2 < r2 < N(N <= 10000);第二行为 N 个不超过10000的正整数。
Output一行 N 个整数,表示数组排序以后的结果,数字之间用空格隔开,末尾换行。
Sample Input6 1 3 2 48 3 1 6 9 2
Sample Output1 8 6 3 9 2
HINT样例解释:区间[1,3]从小到大排序后数组变为{1,3,8,6,9,2},区间[2,4]从大到小排序后数组变成{1,8,6,3,9,2}即为排序后的结果。
解答
#include<stdio.h>
int c[10006];
void s(int *a,int *b);
int main(void)
{
int i,repeat,j,l1,l2,r1,r2,max,min;
while(~scanf("%d",&repeat)){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
for(i=0;i<repeat;i++){
scanf("%d",&c[i]);
}
for(i=l1-1;i<r1-1;i++){
min=i;
for(j=i+1;j<r1;j++){
if(c[min]>c[j]){
min=j;
}
}
s(&c[min],&c[i]);
}
for(i=l2-1;i<r2-1;i++){
max=i;
for(j=i+1;j<r2;j++){
if(c[max]<c[j]){
max=j;
}
}
s(&c[max],&c[i]);
}
for(i=0;i<repeat-1;i++){
printf("%d ",c[i]);
}
printf("%d\n",c[i]);
}
return 0;
}
void s(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}