C语言问题,按照最小值,最大值,次小值,次大值等等依次排列

楼主

52998 [离线]

0☆☆☆☆☆

发帖数:118 积分:350
1楼

真心绕不过来,希望有高手告诉我大致思路,程序如下:
#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[i];
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[i];a[i]=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[i]);
printf("\n");
fun(b,N);
printf("\nThe data after moving:\n");
for(i=0;i<N;i++)printf("%4d",b[i]);
printf("\n");
}



发表于 2014/5/11 6:34:04

狼人 [离线]

1★☆☆☆☆

发帖数:117 积分:417
2楼

可以去了解一下选择排序,这段程序和选择排序的思路是一样的



发表于 2014/5/12 7:59:03

阿刚 [离线]

0☆☆☆☆☆

发帖数:97 积分:270
3楼

循环N/2次
-->找出当前循环的最大、最小值
-->将最大、最小值与数组头交换
-->....(接着循环)
-->完



发表于 2014/5/12 22:48:10

小手冰冰凉 [离线]

0☆☆☆☆☆

发帖数:182 积分:948
4楼

大致思路:
外循环每次数组地址向后+2 当前数组地址中存放最大值,数组地址+1中存放最小值
内循环就是从数组地址+1循环到数组末端,分别找出最大值和最小值
pn=i时说明当前子数组的最大值已经是子数组的第一个元素,不用交换,否则将子数组第一个元素与最大值交换
同理px = i+1时说明当前子数组的最小值已经是子数组的第二个元素,否则将子数组第二个元素与最小值交换
这些操作完毕后,当前子数组的第一个元素肯定是该子数组的最大值,第二个元素肯定是最小值。
然后依次向后循环,直到外循环结束。



发表于 2014/5/13 4:35:06

shmily0908 [离线]

1★☆☆☆☆

发帖数:208 积分:1406
5楼

递归


发表于 2014/5/13 23:52:48
返回本版
1

请您先 登录 再进行发帖

快速回复楼主