C语言问题,按照最小值,最大值,次小值,次大值等等依次排列
  • 浏览:120 评论:3 人

  • 真心绕不过来,希望有高手告诉我大致思路,程序如下:
    #include<stdio.h>
    #define N 9
    void fun(int a[],int n)
    { int i,j,max,min,px,pn,t;
    for(i=0;i<n-1;i+=2)
    {max=min=a;
    px=pn=i;
    for(j=i+1;j<n;j++){
    if(max<a[j])
    {max=a[j];px=j;}
    if(min>a[j])
    {min=a[j];pn=j;}
    }
    if(pn!=i)
    {t=a;a=min;a[pn]=t;
    if(px==i)px=pn;
    }
    if(px!=i+1)
    {t=a[i+1];a[i+1]=max;a[px]=t;}
    }
    }
    main()
    { int b[N]={9,1,4,2,3,6,5,8,7},i;
    printf("\nThe original data:\n");
    for(i=0;i<N;i++)printf("%4d",b);
    printf("\n");
    fun(b,N);
    printf("\nThe data after moving:\n");
    for(i=0;i<N;i++)printf("%4d",b);
    printf("\n");
    }




    我在学C++,当练习了,看别人不带注释的代码是很蛋疼的事情你知道
    #include<stdio.h>
    #define N 9 //N=9
    void fun(int a[],int n) //函数fun的定义
    { int i,j,max,min,px,pn,t; // 用到的变量
    for(i=0;i<n-1;i+=2) //每次处理出两个结果,即在剩余数中找出最大最小值
    //最后一次找出两个最后一个也确定了,这里是第7个,i=6最后一次
    {max=min=a; // 先都默认为第一个数
    px=pn=i; // px、pn用来存放最后交换前的指针序号,初始都默认为剩余的第一个
    for(j=i+1;j<n;j++){
    if(max<a[j])
    {max=a[j];px=j;} //找出剩余最大值位置记在px,数值赋值给max
    if(min>a[j])
    {min=a[j];pn=j;} //找出剩余最小值位置记在pn,数值赋值给min
    }
    if(pn!=i) //判断最小值是否需要交换
    {t=a;a=min;a[pn]=t; //交换过程,其实可以用a[pn]=a;a=min;
    if(px==i)px=pn; //如果剩余的第一个为剩余中最大,交换后它的值已经到了交换前
    //最小值的位置
    }
    if(px!=i+1) //判断最大值是否需要交换
    {t=a[i+1];a[i+1]=max;a[px]=t;} //交换过程同上
    }
    }
    main() //主函数
    { int b[N]={9,1,4,2,3,6,5,8,7},i;
    printf("\nThe original data:\n");
    for(i=0;i<N;i++)printf("%4d",b);
    printf("\n"); //先直接把固定要处理的数显示出来,毕竟是个例子
    fun(b,N); //调用fun开始处理
    printf("\nThe data after moving:\n");
    for(i=0;i<N;i++)printf("%4d",b); //依次输出处理完的结果
    printf("\n");
    }