写在前面:
一轮循环就同时确定最大最小值位置并进行最终互换:
这道题的陷阱在于:
在进行最终位互换时,代码编写中先写最小值确定最终位(即先互换首位置),此时拿最小值打头的序列去测试正确,但用最大值打头的序列(如:10 5 6 8 4 3 1 2 9 7)去测试则错误;相反,先编写最大值确定最终位(即先换尾位置),拿最大值打头的序列去测试正确,拿最小值打头的序列去测试则错误。
当然,也可以“钻空子”,下述代码(先进行最大值确定最终位)是可以通过系统测试的,但对于10 9 8 7 6 5 4 3 2 1 ,仍会输出 10 9 8 7 6 5 4 3 2 1:
#include <stdio.h>
int main()
{
int a[10];
scanf("%d",&a[0]);
int Maxnum=0,Minnum=0;
for(int i=1; i<10; i++)
{
scanf("%d",&a[i]);
if(a[i]>a[Maxnum])
Maxnum=i;
else if(a[i]<a[Minnum])
Minnum=i;
}
int temp;
temp=a[9];
a[9]=a[Maxnum];
a[Maxnum]=temp;
temp=a[0];
a[0]=a[Minnum];
a[Minnum]=temp;
for(int i=0; i<10; i++)
printf("%d ",a[i]);
return 0;
}
但对于要深究并完善自己代码的同学们,在明白了上述可以通过测试的“正确”代码的错误之处的前提下,会发现“真·正确”的代码离我们仅一步之遥:
#include <stdio.h>
int main()
{
int a[10];
scanf("%d",&a[0]);
int Maxnum=0,Minnum=0;
for(int i=1;i<10;i++){
scanf("%d",&a[i]);
if(a[i]>a[Maxnum])
Maxnum=i;
else if(a[i]<a[Minnum])
Minnum=i;
}
int temp;
temp=a[0];
a[0]=a[Minnum];
a[Minnum]=temp;
if(Maxnum==0) //针对初始时首元素即为最大的情况
Maxnum=Minnum; //追溯前一步被最小值换走的“真·最大值”的真实位置,并赋予Maxnum
temp=a[9];
a[9]=a[Maxnum];
a[Maxnum]=temp;
for(int i=0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
PS:在进行完最小值换到首位置(这是前提)后进行判定,if判定是为了追溯被Minnum所指元素换走的“真·最大值”。
若在判定前先进行的是最大值确定最终位,那if判定时就要追溯被Maxnum所指元素换走的“真·最小值”,之后才能进行最小值确定最终位。
另贴出c指针代码:
#include <stdio.h>
void creat(int *head);
void spsort(int *head);
void put(int *head);
int main()
{
int a[10];
creat(a);
spsort(a);
put(a);
return 0;
}
void creat(int *head)
{
int *p=head;
for(int i=0; i<10; i++)
scanf("%d",(p++));
}
void spsort(int *head)
{
int *Maxnum=head,*Minnum=head,*p=head,temp;
for(int i=1; i<10; i++)
if(p[i]>*Maxnum)
Maxnum=&p[i];
else if(p[i]<*Minnum)
Minnum=&p[i];
temp=*Minnum;
*Minnum=p[0];
p[0]=temp;
if(Maxnum==head) Maxnum=Minnum;
temp=*Maxnum;
*Maxnum=p[9];
p[9]=temp;
}
void put(int *head)
{
int *p=head;
for(int i=0; i<10; i++)
printf("%d ",*(p++));
}
当然,如果仅仅是要通过系统测试,前述第一段代码已足够。
9.7 分
32 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复