有关C语言的一道题,看了很久都不明白

来源:百度知道 编辑:UC知道 时间:2024/05/27 18:47:29
题目:求出数组中最大数和次最大数,并把最大数和A[0]中的数对调,次最大数和A[1]中的数对调。。。。。。。。。。。。。。。。我觉的这道题调试后应该是这个答案:12 11 5 0 3 6 9 7 10 8,因为只需调换最大的、次最大的、A[0]和A[1]。。。。。。。。。。。。但是调试后的却是12 11 10 9 8 7 6 5 3 0,顺序全变了。为什么啊。这道题的答案有没有问题啊
#include <conio.h>
#include <stdio.h>
#define N 20
/*************found**************/
void fun(int *a,int n)
{
int I, m, t, k;
for(I=0; I<n;I++)
{
/*************found**************/
m=I;
for(k=I+1; k<n; k++)
if(a[k]>a[m])
m=k;
t=a[I];
a[I]=a[m];
a[m]=t;
}
}
main()
{
int b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i;
system("CLS");
for(i=0; i<n; i++)
printf("%d ",b[i]);
printf("\n");
fun(b,n);
for(i=0; i<n; i++)
printf("%d ", b[i]);
printf("\n");
}

关键在这段程序代码上:for(I=0; I<n;I++)//注意:第一重循环,作用是每一次找到第I+1大的数放进a【I】中,由于一直到n则结果是找到了前n大的数,实际上做了个排序,如果只是前2大的数只要将I<n改为I<2即可。
{
/*************found**************/
m=I;
for(k=I+1; k<n; k++)//第二重循环,注意是从k=I+1开始因为每次前面的数已经选择,不再考虑,也就是说第一重循环I=0时这里寻找的是第一大的数,以此类推当第一重循环I=1时这里寻找第二大的数,因为第一大的数已经放在前面了不再考虑。
if(a[k]>a[m])
m=k;
t=a[I];
a[I]=a[m];
a[m]=t;
}

很简单嘛 这样编就可以了
#include<stdio.h>
void fun(int *a,int n)
{
int max1,max2,i,t,b,c;
max1=a[0];//将a[0]设为最大值
max2=a[1];//将a[1]设为次大值
///////////////////////////////////////【判断最大值,并把最大值与a[0]交换】
for(i=1;i<n;i++)
{
if(max1<a[i])
{
max1=a[i];
b=i;
}
}
t=a[0];
a[0]=max1;
a[b]=t;

////////////////////////////////////////【判断次大值,并把次大值与a[1]交换】
for(i=2;i<n;i++)
{
if(max2<a[i])
{
max2=a[i];