#include
void input(int *s, int n);
void sort(int *s, int n);
void print(int *s, int n);
int main()
{
int n[10], *p=n;
input(p, 10);
sort(p, 10);
print(p, 10);
return 0;
}
void input(int *s, int n)
{
int *m;
for (m=s; mscanf("%d", m++));
}
void sort(int *s, int n)
{
int *i, *j, *min, *max, t;
for (i=s, min=i; ifor (j=i+1; j*j ? min=j++ : j++);
t=*min, *min=*s, *s=t;
for (i=s+1, max=i; ifor (j=i+1; j-1), *(s+n-1)=t;
}
void print(int *s, int n)
{
int *i;
for (i=s; iprintf("%d ", *i++));
printf("\n");
}
#include
void way1(int a[],int n)
{
int i;
for(i=0;iscanf("%d",&a[i]);
}
void way2(int a[],int n)
{
int i,x,y,t;
for(i=1,x=0,y=0;iif(a[x]>a[i])x=i;
if(a[y]0];
a[0]=t;
}
{
t=a[y];
a[y]=a[n-1];
a[n-1]=t;
}
}
void way3(int a[],int n)
{
int i;
for(i=0;iprintf("%d ",a[i]);
}
int main()
{
int a[10];
way1(a,10);
way2(a,10);
way3(a,10);
printf("\n");
return 0;
}
法一和法二的区别是:
法一是两次遍历,第一次遍历找到最小值,然后将最小值与数组第一个元素交换。再进行第二次遍历,找到最大值,然后将最大值与数组最后的元素交换。两次遍历,完成不同的任务。
法二的问题在,一次遍历数组,找到最大最小值所在的位置,然后按题目要求直接进行了元素交换,没有考虑如果最大值刚好在数组第一个位置时的特殊情况,将最小值与数组第一个元素交换后,此时最大值的位置发生了变化,已被调整到原来的最小值位置,如果仍然将原位置与最后元素交换就出现问题了。
法二修改如下,供参考:
#include<stdio.h>
void way1(int a[],int n)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
}
void way2(int a[],int n)
{
int i,x,y,t;
for(i=1,x=0,y=0;i<n;i++)
{
if(a[x]>a[i])x=i;
if(a[y]<a[i])y=i;
}
{
t=a[x];
a[x]=a[0];
a[0]=t;
}
if (y == 0) y = x; //修改
{
t=a[y];
a[y]=a[n-1];
a[n-1]=t;
}
}
void way3(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
int main()
{
int a[10];
way1(a,10);
way2(a,10);
way3(a,10);
printf("\n");
return 0;
}